如何加载多个依赖的主干模型?

Posted

技术标签:

【中文标题】如何加载多个依赖的主干模型?【英文标题】:How to load multiple, dependent Backbone models? 【发布时间】:2012-11-28 08:57:16 【问题描述】:

我的 Backbone 应用程序包含依赖于多个模型的视图。例如,我定义了 2 个模型:

var user = new UserModel(id:1);
user.fetch();
var place = new PlaceModel(id:1);
place.fetch();

现在我想渲染一个依赖于这两个模型的视图:

var home = new House(owner: user, address: place);
home.render()

在确定所有模型都已加载之前,我不想渲染视图。 在我渲染 home 之前,确保 userplace 都被提取的正确方法是什么?

我目前正在使用顺序流程:

user.bind("change", function() place.fetch(););
place.bind("change", function() home.render(););
user.fetch();

但是随着依赖项的增长,这变得笨拙,我觉得必须有更好的方法......

【问题讨论】:

【参考方案1】:

Backbone fetch 使用 jQuery 进行 AJAX 调用,并且像普通的 $.ajax 调用一样,返回一个 jQuery Deferred 对象。

这意味着使用$.when 可以非常优雅地等待多个调用完成:

var place = new PlaceModel(id:96);
var user = new UserModel(id:2458);
var home = new House(owner: user, address: place);

//both .fetch() calls return a promise
//when waits for promises to be fulfilled (or rejected)
$.when(place.fetch(), user.fetch())
  .done(home.render);
  .fail(showError);

编辑:此答案的早期版本声称 Backbone.localStorage 不返回延迟,但确实如此,因此此解决方案也适用于该插件。

【讨论】:

不错!我一直在阅读有关 jQuery 的 deferred 但您的示例清楚地表明这是要走的路。 RequireJS 是我需要在这里考虑的东西……还是只是为了初始加载我的 JS 资产? @lubar,require.js 与 deferred 的使用无关 - 但既然你问过,如果你的代码库很大,我一般推荐它。我还建议使用延迟,因为它们可以简化 javascript 的回调丛林。有关使用 jQuery Deferred 的精彩介绍,请参阅 eng.wealthfront.com/2012/12/…。

以上是关于如何加载多个依赖的主干模型?的主要内容,如果未能解决你的问题,请参考以下文章

具有相同模型的主干多个视图

如何从车把模板访问主干模型的计算字段?

如何从车把模板访问主干模型的计算字段?

如何将我的主干模型连接到视图?

在主干视图中显示两个模型?

如何从多个加载的模型中获取选定的模型?