Backbone JS:自填集合

时间:2013-04-09 16:08:00

标签: javascript backbone.js

我有像这样的Backbone集合

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, 我怎么能这样做?

4 个答案:

答案 0 :(得分:2)

考虑使用REST API,因为Collection#fetch应该完全符合您的要求。

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

答案 1 :(得分:1)

对于Backbone集合,您无需逐个添加模型,框架将完成工作。简单地

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
}

答案 2 :(得分:0)

假设您传递了一个联系模型列表,请执行此操作(您不需要for循环):

this.add(contacts);

The docs提到您可以逐个添加模型,也可以添加为数组。

答案 3 :(得分:0)

同意@Loamhoof。您应该使用主干fetch来完成此任务。

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

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

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