2

我有一个这样的 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]
            }
    }
});

换句话说,我想自己填充集合的模型,我该怎么做?

4

4 回答 4

2

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

var ContactsCollection = Backbone.Collection.extend({
model: Contact,
url: '', // set the URL
initialize: function () {
  this.fetch();
}});
于 2013-04-09T16:38:47.357 回答
1

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

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

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

});

如果您从服务器返回的不是 JSON 数组,或者它被某个节点包裹,您可以覆盖 parse 方法。

parse: function(response) {
  // if it's like {data: [model1, model2, model3...]}
  return response.data
}
于 2013-04-09T18:11:51.190 回答
0

假设您要传入联系人模型列表,请执行以下操作(您不需要for循环):

this.add(contacts);

The docs提到你可以一个一个地添加模型,或者作为一个数组。

于 2013-04-09T16:15:09.653 回答
0

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

我建议您将调用移到集合初始化方法之外。将它与您的其他应用程序控制流/路由器逻辑放在一起会更清晰,更方便。Fetch 将返回一个 jqXHR 对象实现了一个 promise 接口。允许您执行以下操作:

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

p.done(function() { ... });
p.error(function() { ... });
p.always(function() { ... });
于 2013-04-09T17:04:38.233 回答