2013-02-13 12 views
7

Próbuję iterować nad modelami pobranymi przez kolekcję.collection.each() nie wykonuje iteracji po modelach

Mam folowing kawałek kodu:

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(); 
} 

i wyniki:

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 

Więc metoda pobierania nie działa - w obiekcie wysypisko mogę znaleźć 4 rekordy naciągane ale iteracji nad kolekcja robi nie działa ...

Odpowiedz

8

Na podstawie podanego wyjścia nie wygląda to jak wydrukowano "modelu". Prawdopodobnie spowodował to, że po wykonaniu bloku .each() może jeszcze nie zostać pobrane całkowicie. Wynika to z asynchronicznej natury JavaScript.

Spróbuj tego w swojej metodzie initialize:

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(); 
}, 

Innym sposobem radzenia sobie z tym jest dodanie obsługi sukces na sprowadzić, ale myślę, że słuchanie zresetować zdarzenia powinny być wystarczające w tym przypadku.

Mam nadzieję, że to pomoże!

BTW, jak mówi Cyclone, program obsługi .each powinien po prostu być modelem bez indeksu. :)

+1

Problem może pochodzić również z wyjścia serwera, który musi być prawidłową tablicą obiektów json. tj. w php indeksowana tablica z kodowaniem json –

+1

Twój iterator powinien być: 'this.collection.each (function (model) {...});' OR 'this.collection.each (funkcja (model, indeks) {...});' OP ma indeks i model w niewłaściwy sposób. –

+0

Musiałem zrobić każdy z kolekcji. Modele takie jak ten (nie kolekcja): http://stackoverflow.com/questions/11726943/for-loop-over-backbone-collection...to był mój problem. – Kelly

19

Wykonanie each na kolekcji daje model sam w sobie jako .

Spróbuj tego:

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

To powinno dać wam model dla bieżącej iteracji.

Powiązane problemy