使用骨干j中的相同集合从不同URL获取数据

时间:2012-12-06 19:43:11

标签: javascript jquery backbone.js backbone-model backbone-collections

我有一个集合,必须调用4个外部apis例如:http://www.abc.comhttp://www.fgt.comhttp://www.jkl.comhttp://www.rty.com

我有一个名为Todos.js的Collection。有没有办法可以在一个集合中一起获取4个api,因为所有四个api都会为我提供相同的模型响应 因此,我从4 apis得到的响应具有相同的数据结构,即“名称”和“链接”。

有没有办法可以在同一个集合中附加所有回复?实现这一目标的最佳方法是什么?

2 个答案:

答案 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 ,这可能仅在网址保持静态且单一时才适用。