Heute ist mein erster Tag von backbone.js, also mach es mir hier leicht. Ich habe ein view, ein collection und ein model, die ein select füllen.

Ich kann die Geldstrafe select mit einem fest codierten array füllen. Ich verwende jedoch eine vorhandene API und muss zuerst die Antwort analysieren. Dies scheint auch in Ordnung zu funktionieren.

Was ich nicht weiß, ist, wer sagen soll, was geändert wurde, um meine neu zurückgegebenen Ergebnisse / Modelle zu rendern ... Der Code sollte sinnvoller sein, wenn das nicht hilft.

var UserGroup = Backbone.Model.extend();

var UserGroups = Backbone.Collection.extend({

    initialize:function(){
        this.fetch();
    },

    model: UserGroup,

    url: "http://myAPI/getUserGroups",

    parse: function(json){

        return json["GetUserGroups"]["Results"];
    }

});

var GroupSelectView = Backbone.View.extend({

    el: $("select"),

    initialize: function() {
        var that = this;

        this.collection = new UserGroups();

        this.render();

    },

    render: function(){
        _.each(this.collection.models, function(group){
            $("<option/>", { value: group.get("Id"), text: group.get("Name")} ).appendTo(this.el)
        }, this);
    },
});

var groupSelectView = new GroupSelectView();

Was glaubst du? Bekomme ich es

1
Jon Wells 9 Okt. 2012 im 16:44

3 Antworten

Beste Antwort

Um etwas flexibler zu sein, können Sie Ereignisse reset und add anhören.

Die Auflistung ist reset, wenn Sie sie vom Server (oder lokal) fetch, aber wenn Sie add Modelle oder fetch mit der Option add verwenden, ein Ereignis hinzufügen für jedes Modell wird stattdessen abgefeuert.

Backbone.js: holen

Das sollte funktionieren:

var GroupSelectView = Backbone.View.extend({

    initialize: function() {
        var that = this;

        this.setElement($("select"));
        this.collection = new UserGroups();

        // listen to add and reset events but handle them differently
        // fired on collection.add(model) and collection.fetch({add: true})
        this.collection.on("add", this.renderItem, this);
        // fired on collection.fetch()
        this.collection.on("reset", this.render, this);

    },

    render: function(){
        // backbone collections already come with some underscore methods built in
        this.collection.each(this.renderItem, this);
    },

    renderItem: function(group) {
        this.$el.append($("<option/>", {
            value: group.get("Id"),
            text: group.get("Name")})
        );
    }
});
3
Torsten Walter 9 Okt. 2012 im 13:12

Sie können Backbone.Events verwenden, um Änderungen zu veröffentlichen / zu abonnieren. Folgen Sie dem Link für weitere Informationen.

Modelle und Sammlungen verfügen über integrierte Ereignisse, die für häufig verwendete Anwendungsfälle ausgelöst werden, z. B. Attribute eines Modells, das geändert wird ('Änderung'), und Abrufen der Modelle einer Sammlung ('Zurücksetzen').

So lösen Sie eine Änderung aus (Veröffentlichen):

myObject.trigger ('event');

Um eine Änderung zu abonnieren (Abonnent)

myObject.on('event',myCallback,context);

Stellen Sie myCallback auf die Rendermethode Ihrer Ansicht ein.

Weitere Informationen zu Backbone-Ereignissen finden Sie in diesem Beitrag.

0
Pramod 9 Okt. 2012 im 13:07

Sie könnten Folgendes tun ...

var GroupSelectView = Backbone.View.extend({

    el: $("select"),

    initialize: function() {
        var that = this;

        this.collection = new UserGroups();
        this.collection.on( 'change', this.render, this );


    //  You could try this too, 1 is for 1 item is added, the other, when all items are changed
    //  this.postCollection.on('add', this.addOne, this);
    //  this.postCollection.on('reset', this.addAll, this);

        this.render();

    },

    render: function(){
        _.each(this.collection.models, function(group){
            $("<option/>", { value: group.get("Id"), text: group.get("Name")} ).appendTo(this.el)
        }, this);
    },
});
1
jodarove 9 Okt. 2012 im 13:09