2013-02-13 1 views
7

Sto tentando di ripetere i modelli recuperati dalla raccolta.collection.each() non itera sui modelli

ho folowing pezzo di codice:

initialize: function() { 
       this.collection = new UserCollection(); 
       this.collection.fetch(); 
       this.render(); 
      }, 

      renderCollection: function() { 
       console.log("rendering collection"); 
       this.collection.each(function(index,model){ 
        console.log("model"); 
       }); 
       console.log(this.collection); 
      }, 

render: function() { 
       this.template = _.template(template, {}); 
       this.$el.html(this.template); 
       // some other stuff 
       this.renderCollection(); 
} 

e risultati:

rendering collection 

d {models: Array[0], length: 0, _byId: Object, constructor: function, model: function…} 
_byId: Object 
_idAttr: "id" 
length: 4 
models: Array[4] 
0: d 
_changing: false 
_events: Object 
_pending: false 
_previousAttributes: Object 
attributes: Object 
created: "2013-02-13 09:22:42" 
id: "1" 
modified: "2013-02-13 09:22:42" 
role: "admin" 
username: "[email protected]" 
__proto__: Object 
changed: Object 
cid: "c5" 
collection: d 
id: "1" 
__proto__: e 
1: d 
2: d 
3: d 
length: 4 
__proto__: Array[0] 
__proto__: e 
user_list.js:25 

Quindi il metodo di recupero ha fatto il lavoro - in discarica oggetto posso trovare 4 record inverosimile ma iterare sulla collezione fa non funziona ...

risposta

8

In base all'output fornito, non sembra che sia stato stampato alcun "modello". Probabilmente è causato da, quando il blocco .each() viene eseguito, this.collection potrebbe non essere stato ancora completamente recuperato. Ciò è dovuto alla natura asincrona di JavaScript.

Prova questa nel metodo di inizializzazione:

initialize: function() { 
    var me = this; 
    this.collection = new UserCollection(); 
    // Listen to 'reset' events from collection, so when .fetch() is completed and all 
    // ready to go, it'll trigger .render() automatically. 
    this.listenTo(this.collection, 'reset', this.render); 
    this.collection.fetch(); 
}, 

L'altro modo per gestire questa situazione è quello di aggiungere un gestore di successo sul prendere, ma penso che l'ascolto di ripristinare gli eventi dovrebbe essere sufficiente in questo caso.

Spero che questo aiuti!

BTW, come dice Cyclone, il gestore di .each dovrebbe essere solo un modello senza l'indice. :)

+1

il problema potrebbe venire anche dall'output del server che deve essere una matrice valida di oggetti json. in php un array json_encoded indicizzato –

+1

Il tuo iteratore dovrebbe essere: 'this.collection.each (function (model) {...});' O 'this.collection.each (funzione (modello, indice) {...});' L'OP ha indice e modella il modo sbagliato. –

+0

Ho dovuto eseguire una copia su ogni collection.models come questo (non collezione): http://stackoverflow.com/questions/11726943/for-loop-over-backbone-collection...questo era il mio problema. – Kelly

19

Fare each alla raccolta dà model come argument.

Prova questo:

this.collection.each(function(model){ 
    console.log(model); 
}); 

Dovrebbe dare la model per l'iterazione corrente.