如何从多个URL填充主干模型

我想使用一个主干模型,它由来自不同URL端点的数据组成。是否可以在一个模型中指定多个URL?我希望避免手动调用AJAX

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

到目前为止,我可以想到两种选择:使用每个URL的部分模型构建主干模型,或者使用一个URL,然后覆盖model.fetch()调用其他URL。但这两个都让我不舒服

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

我认为你建议的两种方法都很合理,但就我个人而言,我会投票支持fetch方法

使用嵌套模型具有“开箱即用”的优点;换句话说,通过为每个服务器使用一个模型<=>客户端映射—您无需更改任何主干.Model方法。但是,这种方法的问题在于,最终会导致多个模型的聚集

如果这是有意义的(数据检索除外),那么就坚持使用嵌套模型。但如果不是这样的话,那么您将强制您的代码的其余部分使用多个模型,而不仅仅是一个模型,以保持数据检索代码的简单。如果您希望将数据检索代码复杂化,并使其他所有内容保持简单,那么最好覆盖fetch

fetch做一件事,那就是通过数据与远程URL之间的一对一映射来检索数据。如果您想要一对多映射,只需覆盖默认的fetch行为就非常有意义。另外,您知道重写获取是相当安全的,因为它的名称不是\u fetch,主干使用下划线样式来命名它的伪私有方法(例如\u validate

如果您仍然不喜欢这两种方法中的任何一种,那么还有另一种选择:requestevents。最新版本的主干网有一个名为request的新事件,每当启动fetch时都会触发该事件。这意味着您可以设置一个事件处理程序来检索辅助数据,以响应主数据的请求,如下所示:

Backbone.Model.extend({
初始化:函数(){
this.on('request',this.handleRequest);
_.bindAll(这是“handleTriggeredResponse”);
},
HandlerRequest:函数(){
$.ajax({url:secondDataUrl,complete:this.handleTriggeredResponse});
$.ajax({url:tertiaryDataUrl,complete:this.handleTriggeredResponse});
},
HandletRiggereResponse:功能(响应){
这个.set(response.data);
},
url:firstDataUrl
});

发表评论