3

我的 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()

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

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

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

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

4

1 回答 1

5

Backbonefetch使用 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 不返回延迟,但确实如此,因此此解决方案也适用于该插件。

于 2012-12-10T21:56:38.670 回答