我有一个集合,必须调用4个外部apis例如:http://www.abc.com,http://www.fgt.com,http://www.jkl.com和http://www.rty.com。
我有一个名为Todos.js的Collection。有没有办法可以在一个集合中一起获取4个api,因为所有四个api都会为我提供相同的模型响应 因此,我从4 apis得到的响应具有相同的数据结构,即“名称”和“链接”。
有没有办法可以在同一个集合中附加所有回复?实现这一目标的最佳方法是什么?
答案 0 :(得分:6)
我认为方法是覆盖fetch
,在其中对每个API进行Ajax调用。将返回的部分集存储在临时数组中,当所有4个完成后,使用this.reset
创建集合。 (您可以使用JQuery的Deferred
,或者只保留已返回的调用次数的内部计数。)
这样的事情:
var Collection = Backbone.Collection.extend({
fetch: function() {
this.completeCount = 0;
this.errorCount = 0;
this.temp = [];
this.urls = [ 'url1', 'url2', 'url3', 'url4' ];
var self = this;
// make a $.get call for each URL and add
_.each(this.urls, function(url) {
$.get(url, { success: function(data) {
console.log("Got partial collection from " + url);
self.addPartial(data);
// alternatively, just call "self.add(data);" here
}, error: function(response) {
console.log("Oops, the Ajax call failed for some reason... ignoring");
self.completeCount ++;
self.errorCount ++;
} });
});
},
// add a JSON array that contains a subset of the collection
addPartial: function(data) {
this.completeCount ++;
var self = this;
// add each item to temp
_.each(data, function(item) {
self.temp.push(item);
});
// if all have been received, then create the collection
if (this.completeCount == this.urls.length) {
this.reset(this.temp);
}
}
});
Here's a Fiddle我用一个只在短暂延迟后返回虚拟数据的方法替换了$.get
。
对评论的回应
将收集的响应添加到集合中可能更好(无论如何都更容易)。 Here's an updated Fiddle.
答案 1 :(得分:1)
我知道这是一个老问题,但如果有人到达这里,这些信息可能有所帮助。 要保留集合提取的数据,您可以使用以下选项更改网址并随时调用方法fetch():
reset: false,
remove: false,
喜欢这个
yourCollection.fetch({reset: false, remove: false, [other]: [wathever]})
这就是全部,不需要覆盖该方法。 (也许在2012年它是必要的,不知道。事实是这些选项适用于Backbone 1.1.2或更高版本)。请注意,我不确定这是否会合并,或者只是添加新数据,即使它已被重复播放。
文档(http://backbonejs.org/#Collection-fetch)对于' 重置'有点混乱。选项,因为它默认情况下已确定为 false ,这可能仅在网址保持静态且单一时才适用。