如何加载多个依赖的主干模型?
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
之前,确保 user
和 place
都被提取的正确方法是什么?
我目前正在使用顺序流程:
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/…。以上是关于如何加载多个依赖的主干模型?的主要内容,如果未能解决你的问题,请参考以下文章