我有一个描述组织的模型,以及描述组织权限的子集合。
在我看来,我需要在渲染之前从两个模型中获取数据。当我将视图渲染方法绑定到一个事件(例如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为止叫?
答案 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;
this.permissionsFetched
和this.modelFetched
变量时呈现您的视图或部分视图。这样,您的第一个渲染不会触发错误,并且您的视图应该在第二次获取结果后呈现,无论它们执行的顺序如何......
它感觉不到100%干净,可能有更好的方法来做到这一点。然而,它对我来说工作正常,它比让你的序列串行好一点。
答案 2 :(得分:0)
我处理此问题的方法是使用计数器跟踪当前待处理的请求数量:
request
开启计数器sync
或error
上,计数器会递减0
转到1
时,我会发起loading
事件1
转到0
时,我会发起loaded
事件您可以实现这样的系统,并将render
功能绑定到loaded
事件。