我想使用由不同URL端点的数据组成的单个骨干模型.是否可以在单个模型中指定多个URL?我想避免手动调用
AJAX.
到目前为止,我一直在使用jQuery Deferreds调用多个URL并将其结果合成为一个对象.
到目前为止,我可以想到两个选项:使用每个URL的部分模型构建一个Backbone模型,或者使用一个URL,然后覆盖Model.fetch()来调用其他URL.但没有一个让我舒服.
(或者我可以尝试贿赂API开发人员提供一个合并的URL端点…)
我认为你们提出的两种方式都是非常合理的,但是我个人投票支持这种方式.
使用嵌套模型具有“开箱即用”的优势;换句话说,通过为每个服务器使用一个模型< =>客户端映射,你不必更改任何Backbone.Model方法.这种方法的问题是,您结束了多个模型的集合.
如果这是有道理的(数据检索),然后坚持嵌套模型.但是,如果不是,您强制其余的代码使用几个模型,而不仅仅是为了保持您的数据检索代码简单.如果你宁愿使数据检索代码复杂化,并保持一切简单,那么你最好是覆盖提取.
抓取做一件事,而且通过它和一个远程URL之间的一对一映射来检索数据.如果你想要一对多的映射,那么只需覆盖默认的提取行为就可以了.此外,您知道覆盖提取是相当安全的,因为它的名称不是_fetch,Backbone使用下划线样式来命名其伪私有方法(例如_validate).
如果您仍然不喜欢这些方法之一,还有一个选项:请求事件. Backbone的最新版本有一个称为请求的新事件,每当提取开始时都会触发.这意味着您可以设置一个事件处理程序来检索辅助数据以响应主数据的请求,如下所示:
Backbone.Model.extend({ initialize: function() { this.on('request',this.handleRequest); _(this).bindAll('handleTriggeredRequestResponse'); },handleRequest: function() { $.ajax(url: secondDataUrl,complete: this.handleTriggeredResponse); $.ajax(url: tertiaryDataUrl,complete: this.handleTriggeredResponse); },handleTriggeredResponse: function(response) { this.set(response.data); },url: firstDataUrl });