【问题标题】: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();

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

【问题讨论】:

    标签: backbone.js requirejs javascript-framework


    【解决方案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/…。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    相关资源
    最近更新 更多