这是我想要了解的内容。
我经常发现自己写这样的骨干:
var CallModel = Backbone.Model.extend({
});
var CallsCollection = Backbone.Collection.extend({
model: CallModel,
url: 'url/to/external/json'
});
这是一个非常基本的示例,但正如您所看到的,模型中没有任何内容真正通过对从数据库构建的json文件的外部URL调用进入集合的所有数据。
那么模型的目的是什么?我确信我可能没有最大限度地使用backbone.js,这就是我在这里问你们的原因。
答案 0 :(得分:2)
您不需要来指定模型。如果您未指定此选项,则Backbone集合将默认使用Backbone.Model。如果您不需要集合的模型属于特定实例,则以下内容同样适用。
var CallsCollection = Backbone.Collection.extend({
url: 'url/to/external/json'
});
实质上,在集合中指定模型选项只是确保添加到此集合的对象将是该特定模型类的实例的一种方法。如果添加到集合中的模型没有Backbone.Model可用的任何自定义行为,则无需创建和指定模型,因为Backbone集合将默认使用Backbone.Model的实例作为我已经提到了。但是,如果您希望确保添加到特定集合的模型具有特定类型并共享自定义行为(例如验证,默认值等),则可以通过扩展Backbone.Model并在其中指定此类来创建自己的模型类。集合。我希望这能为你解决问题。
答案 1 :(得分:2)
首先," 模型中没有任何内容真正通过外部网址调用将所有数据传入集合" - 事实并非如此。
让我们假设你有以下几点:
//Model
var CallModel = Backbone.Model.extend({
defaults: {
cost:0,
duration:0
}
});
(没有自定义属性或方法,扩展原始Backbone.Model
没有意义)
//Collection
var CallsCollection = Backbone.Collection.extend({
model: CallModel,
url: 'url/to/external/json'
});
从服务返回的json数据可能类似于:
//Response
{
callSummary: {
missed: 2,
received: 3,
totalCalls:5
totalDuration: 20
}
calls: [{
id:001,
caller:"Mr.A",
callee:"Mr.B",
cost:1,
duration:5
},{
id:002,
caller:"Mr.X",
callee:"Mrs.Y",
cost:1,
duration:7
},{
id:003,
caller:"Mr.A",
callee:"Mrs.B",
cost:1,
duration:8
}],
//and more additional information from your db
}
现在,您可以通过调用fetch方法为数据填充数据:
CallsCollection.fetch();
您的收藏应该类似于:
{
models: [{
attributes: {
callSummary: {},
calls: [{},{},{}],
...
},
...
}],
length:1,
url: "url/to/external/json",
...
}
数据将添加到模型的属性哈希中。如果您没有指定特定模型,正如Bart在他的answer中提到的那样,骨干网将使用Backbone.Model
实例填充集合:这仍然没什么用处 - Wew ... A < strong>集合,单个模型,其中包含完整的响应数据,因为它是......
此时,您想知道为什么我甚至打扰创建模型,然后是集合 ..?
此处的问题是集合派生自数组,而模型派生自对象。在这种情况下,我们的根数据结构是一个Object(而不是一个数组),因此我们的集合试图将返回的数据直接解析为单一模型。
我们真正想要的是我们的收藏品来自&#34;电话&#34;服务响应的属性。为解决此问题,我们只需在我们的集合中添加parse方法:
var CallsCollection = Backbone.Collection.extend({
model: CallModel,
url: 'url/to/external/json',
parse: function(response){
/*save the rest of data to corresponding attributes here*/
return response.calls; // this will be used to populate models array
}
});
现在您的收藏将如下所示:
{
models: [{
...
attributes: {
...
id:001,
caller:"Mr.A",
callee:"Mr.B",
cost:1,
duration:5
}
},{
...
attributes: {
...
id:002,
caller:"Mr.X",
callee:"Mrs.Y",
cost:1,
duration:7
}
},{
...
attributes: {
...
id:003,
caller:"Mr.A",
callee:"Mrs.B",
cost:1,
duration:8
}
}],
length:3,
url: "url/to/external/json",
...
}
这是我们想要的! :现在处理数据非常简单:您可以有效地使用添加,删除,查找,重置和handful of other collection methods。
您可以将此模型数组传递到您选择的模板库中,可能使用双向绑定:当其中一个调用模型的相应视图更改时,特定模型将更新,事件将从模型传播到集合,并将特定模型传递给处理函数。
现在,您可以轻松地在单个数据单元(每个模型)上调用抓取,保存,销毁,清除和lot of other methods而不是将整个数据保存在单个模型中 - 这几乎没用,您可以手动迭代响应数据并执行CRUD和类似的操作,在大多数情况下:重新渲染整个集合视图。这非常,非常糟糕,完全无法维护。
结束:如果您的数据源没有返回对象数组,或者您没有解析响应并返回{{1}的对象数组要填充模型数量 - 然后定义集合几乎没用。
希望你现在明白了。
非常有用的信息来源:
答案 2 :(得分:-2)
听起来很奇怪,但这就是方法。
骨干中的每个集合都必须代表一个模型,所以基本上集合是一个模型列表。
即使您的模型没有数据,您也需要在创建集合时指明它。
这就是骨干对集合的作用。