2012-04-07 7 views
0

Ich habe eine Ansicht, die eine fetch() zu einer Sammlung und einige Modelle vom Server zurückgibt.Backbone.js collection.models nicht angezeigt, aber dort

ProductsView = Backbone.View.extend({ 

    initialize: function() { 
     _.bindAll(this, 'render'); 
     this.collection = new ProductCollection(); 
     this.collection.fetch({data: {limit : this.options.limit}}); 

     console.log(this.collection); 

     this.render(); 
    }, 
    render: function() { 

     var template = _.template($("#product-template").html(), this); 
     $(this.el).html(template); 
     return this; 
    } 
}); 

Im console.log oben sehe ich das Objekt wie folgt:

products.view.js:13 
d 
_byCid: Object 
_byId: Object 
length: 7 
models: Array[7] 
__proto__: x 

Die models gibt es, aber wenn ich console.log(this.collection.models) tun zeigt es nur [], im Inneren der Modelle, ist ein Array von Objekten wie folgt aus:

models: Array[7] 
0: d 
1: d 
2: d 
3: d 
4: d 
5: d 
6: d 

jedes diese haben attributes mit den Werten, die zurückgegeben wurden.

Jede Idee, warum die Modelle nicht angezeigt werden, wenn ich this.collection.models oder get() verwende, funktioniert auch nicht.

Vielen Dank!

+0

Wo schreibst du das 'console.log (this.collection.models)'? Ich meine diejenige, die Ihnen dadurch ein leeres Array gibt. – ZenMaster

Antwort

6

Im Allgemeinen this.collection.fetch({data: {limit : this.options.limit}}) ist ein asynchroner Vorgang, so dass Sie nächste Zeile nicht unbedingt den richtigen Inhalt der collection drucken wird.

Stattdessen sollten Sie success verwenden und error Rückrufe der fetch Verfahren als Teil seiner options Parameter liefert (oder hören change Ereignis Sammlung), etwa so:

this.collection.fetch(
    { 
     data: { limit : this.options.limit }, 
     success : function(collection, rawresponse) { 
      // do something with the data, like calling render 
     } 
    } 
); 

Für Vollständigkeit halber:

this.collection.on('change', function(){ // some handling of the data }; 
this.collection.fetch(); 

ist die ereignisbasierte Methode.

+0

Ich würde betonen, dass das Hören auf Change-Event ein Weg ist. Die Sammlung sollte das Rendering von Ansichten nicht verarbeiten. –

+0

Es kann jedoch einige Daten manipulieren. Ich bevorzuge eine ereignisbasierte Entwicklung, also kein Argument von mir. – ZenMaster

+0

@ZenMaster Ich habe es innerhalb des Callbacks gemacht, aber es zeigte immer noch nicht die Modelle, wenn ich 'this.collection.models' - könnte es damit in Verbindung gebracht werden, die als ein Array (' Array [7] ') anstelle von einem zeigt Objekt? – dzm

Verwandte Themen