2013-04-09 71 views
2

我有一个骨干收集这样骨干JS:自填入收藏

var ContactsCollection = Backbone.Collection.extend({ 
    model: Contact, 

    initialize: function() { 
      //retrieves contacts from web service 
      //contactsLoaded: is the callback that gets called after 
      //the contacts get received 
      loadContacts(this.contactsLoaded); 
    }, 

    contactsLoaded: function (contacts) { 
      for (var i = 0; i < contacts.length; i++) { 
       //TODO populate the collection [models][1] 
      } 
    } 
}); 
换句话说

,我想自我填充集合的models, 我怎么能这样做呢?

回答

1

对于骨干集合,你不必逐个添加模型中的一个,该框架将做的工作。只要

var ContactsCollection = Backbone.Collection.extend({ 
    model: Contact, 
    url: '/contacts' // whatever web service url you are using 

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

}); 

如果从服务器上你的回报是不是一个JSON阵列,或者它包裹着一些节点,您可以覆盖的解析方法。

parse: function(response) { 
    // if it's like {data: [model1, model2, model3...]} 
    return response.data 
} 
0

假设你正在传递接触模型的列表,这样做(你不需要for环路):

this.add(contacts); 

The docs何况你可以通过一个新增车型之一,或作为一个数组。

+0

我做了,并且收到以下错误:TypeError:Object不支持属性或方法'add'。什么可能是错误的? – 2013-04-09 16:17:13

+0

@MinaSamy检查“this”分配给什么。另外我意识到你不需要逐个添加它们。查看我的更新。 – 2013-04-09 16:23:34

2

考虑使用REST API作为Collection#fetch应该按照您的要求进行。

var ContactsCollection = Backbone.Collection.extend({ 
model: Contact, 
url: '', // set the URL 
initialize: function() { 
    this.fetch(); 
}}); 
0

同意@Loamhoof。您应该使用骨干提取来完成此操作。

我建议你移动调用外部集合初始化方法。将它与其他应用程序控制流/路由器逻辑放在一起会更清楚,更方便。 Fetch将返回一个jqXHR对象实现一个promise界面。让你做这样的事情:

var contactsCollection = new ContactsCollection({}); 
var p = contactsCollection.fetch(); 

p.done(function() { ... }); 
p.error(function() { ... }); 
p.always(function() { ... });