在渲染视图之前,如何管理两个不同模型的数据?

时间:2013-02-22 13:40:48

标签: backbone.js backbone-events

我有一个描述组织的模型,以及描述组织权限的子集合。

在我看来,我需要在渲染之前从两个模型中获取数据。当我将视图渲染方法绑定到一个事件(例如model.change或subcollection.sync)时,有时我的屏幕会在填充模型之前显示,从而产生错误。

以下是我的代码的相关部分:

  this.model = new OrgModel({id: id});
  this.model.permissions = new PermissionsCollection({org: id});

  this.model.permissions.on("sync", this.render);  // SOMETIMES GETS CALLED BEFORE model:sync GETS CALLED

  this.model.permissions.fetch({error: Utils.apiError});
  this.model.fetch({error: Utils.apiError});

我不确定哪个事件要调用“渲染” - 因为有时候每个请求都会先回来。

有没有办法将“sync”事件绑定在一起,这样当调用model.fetch时,它又会调用subcollection.fetch,并且不会传回“sync”事件,直到subcollection:sync为止叫?

3 个答案:

答案 0 :(得分:3)

var deferred1, deferred2, that = this;
this.model = new OrgModel({id: id});
this.model.permissions = new PermissionsCollection({org: id});
deferred1 = this.model.permissions.fetch({error: Utils.apiError});
deferred2 = this.model.fetch({error: Utils.apiError});

$.when(deferred1, deferred2).then(function(){
    that.render();
});

有一个非常强大的延迟和承诺的概念。有关该主题的更多信息,请参阅api.jquery.com/jQuery.Deferred

答案 1 :(得分:0)

这可能不是最好的方法,但我通常会处理:

  • 获取集合模型后添加成功函数。每个函数都会初始化一个变量,如this.permissionsFetched = true;
  • 修改render(),以便在初始化this.permissionsFetchedthis.modelFetched变量时呈现您的视图或部分视图。

这样,您的第一个渲染不会触发错误,并且您的视图应该在第二次获取结果后呈现,无论它们执行的顺序如何......

它感觉不到100%干净,可能有更好的方法来做到这一点。然而,它对我来说工作正常,它比让你的序列串行好一点。

答案 2 :(得分:0)

我处理此问题的方法是使用计数器跟踪当前待处理的请求数量:

  • request开启计数器
  • syncerror上,计数器会递减
  • 当计数器从0转到1时,我会发起loading事件
  • 当计数器从1转到0时,我会发起loaded事件

您可以实现这样的系统,并将render功能绑定到loaded事件。