如何从多个URL填充Backbone模型

Gin*_*ngi 13 ajax backbone.js

我想使用由来自不同URL端点的数据组成的单个Backbone模型.是否可以在单个模型中指定多个URL?我想避免手动调用AJAX.

到目前为止,我一直在使用jQuery Deferreds调用多个URL并将其结果合成为一个对象.

到目前为止,我可以考虑两个选项:为每个URL构建一个带有部分模型的Backbone模型,或者使用一个URL,然后覆盖Model.fetch()以调用其他URL.但是没有人让我感到舒服.

(或者我可以尝试贿赂API开发人员以提供合并的URL端点...)

mac*_*ost 8

我认为你提出的两种方式都很合理,但我个人对这种fetch方法投了赞成票.

使用嵌套模型具有"开箱即用"的优点; 换句话说,通过为每个服务器<=>客户端映射使用一个模型,您可以避免更改任何Backbone.Model方法.然而,这种方法的问题在于你结束了多个模型的集合.

如果这有意义(除了数据检索),那么坚持使用嵌套模型.但是如果不是这样,你就会强迫你的其余代码使用多个模型而不仅仅是一个模型,以保证数据检索代码的简单性.如果您只是简单地复制数据检索代码并保持其他一切简单,那么您最好覆盖fetch.

fetch做一件事,那就是通过它和远程URL之间的一对一映射来检索数据.如果你想要一对多的映射,那么只需覆盖默认fetch行为就足够了.另外你知道覆盖它是相当安全的,fetch因为它的名字不是_fetch,而Backbone使用下划线样式来命名它的伪私有方法(例如._validate).

如果您仍然不喜欢这两种方法,还有另外一种选择:request事件.最新版本的Backbone有一个新的事件request,只要一个fetch启动就会被触发.这意味着您可以设置一个事件处理程序来检索辅助数据以响应主数据的请求,如下所示:

Backbone.Model.extend({
    initialize: function() {
        this.on('request', this.handleRequest);
        _.bindAll(this, 'handleTriggeredResponse');
    },
    handleRequest: function() {
        $.ajax({url: secondDataUrl, complete: this.handleTriggeredResponse});
        $.ajax({url: tertiaryDataUrl, complete: this.handleTriggeredResponse});
    },
    handleTriggeredResponse: function(response) {
        this.set(response.data);
    },
    url: firstDataUrl
});
Run Code Online (Sandbox Code Playgroud)