2012-04-07 1 views
0

У меня есть представление, которое делает fetch() для коллекции и возвращает некоторые модели с сервера.Backbone.js collection.models не отображается, но там

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

В приведенном выше console.log, я вижу объект, как это:

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

models есть, но когда я console.log(this.collection.models) это показывает только [], внутри модели, является массивом объектов, как это:

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

Каждый из них имеет attributes со значениями, которые были возвращены.

Любая идея, почему модели не будут отображаться при использовании this.collection.models или с использованием get() тоже не работает.

Большое спасибо!

+0

Где вы пишете, что 'console.log (this.collection.models)'? Я имею в виду тот, который дает вам пустой массив. – ZenMaster

ответ

6

Обычно this.collection.fetch({data: {limit : this.options.limit}}) является асинхронной операцией, поэтому следующая строка не обязательно будет печатать правильное содержимое collection.

Вместо этого вы должны использовать success и error обратные вызовы метод fetch обеспечивает как часть его параметра options (или слушать change события коллекции), например, так:

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

Ради Комплектность:

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

- это метод, основанный на событиях.

+0

Я хотел бы подчеркнуть, что прослушивание события изменений - это путь. Сбор не должен обрабатывать рендеринг. –

+0

Он может обрабатывать некоторые манипуляции с данными. Я предпочитаю развитие на основе событий, поэтому никаких аргументов у меня нет. – ZenMaster

+0

@ZenMaster Я сделал это в обратном вызове, но он все еще не отображал модели, когда я делаю 'this.collection.models' - может ли он быть связан с ним, показывая как массив (' Array [7] ') вместо Объект? – dzm