2

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

在我看来,我需要在渲染之前从两个模型中获取数据。当我将视图渲染方法绑定到一个事件(例如 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});

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

有没有办法将“同步”事件绑定在一起,以便在调用 model.fetch 时,它又会调用 subcollection.fetch,并且在调用 subcollection:sync 之前不会传回“同步”事件?

4

3 回答 3

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

于 2013-02-22T21:18:44.637 回答
0

我处理这个问题的方法是使用计数器来跟踪当前有多少请求处于待处理状态:

  • request计数器上递增
  • Onsyncerror计数器递减
  • 当计数器从0到 时1,我触发一个loading事件
  • 当计数器从1到 时0,我触发一个loaded事件

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

于 2013-02-22T15:39:09.133 回答
0

这可能不是最好的方法,但我通常通过以下方式处理:

  • 获取您的收藏模型后添加成功功能。每个函数都会初始化一个变量,例如this.permissionsFetched = true;
  • this.permissionsFetched修改 render() 以便在您的和this.modelFetched变量已初始化的情况下呈现您的视图或其中的一部分。

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

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

于 2013-02-22T15:23:54.137 回答