我目前正在使用 Backbone + RequireJS。在我的应用程序中,我显示了一个树小部件,该小部件由具有嵌套集合的相同模型构建。也就是说:
FooCollection
define(['backbone', 'models/foo'], function(Backbone, FooModel) {
var FooCollection = Backbone.Collection.extend({
model: FooModel
});
return FooCollection;
});
FooModel
define(['backbone', 'underscore'], function(Backbone, _) {
var FooModel = Backbone.Model.extend({
initialize : function() {
_.bindAll(this, 'adoptOne', 'adoptAll');
var self = this;
// Need to do it this way or RequireJS won't find it
require(['collections/foos'], function(FooCollection) {
self.foos = new FooCollection();
self.on('change:foos', function() {
self.foos.reset(self.get('foos'));
});
self.foos.on('reset', self.adoptAll);
self.foos.on('add', self.adoptOne);
self.foos.reset(self.get('foos');
});
},
adoptAll : function() {
this.foos.each(this.adoptOne);
},
adoptOne : function(foo) {
foo.parent = this;
}
});
return FooModel;
});
以上工作。我没有收到任何错误,一切都按预期构建。然而...
// In a view
this.foos = new FooCollection();
this.foos.fetch({
success : function(foos) {
var treeView = new TreeView();
treeView.render(foos); // Doesn't work!!
}
});
由于同步问题,上述方法不起作用:TreeView在嵌套集合完成创建之前被渲染(因为运行代码需要更长的时间,或者因为加载'collections/foos'需要时间。
无论哪种方式,我都可以用这个来修复它:
setTimeout(function() {
treeView.render(foos);
}, 100);
但是,当然,这只是一个黑客。在生产环境中,它可能需要 100 多毫秒,并且代码无法运行。
所以,我想我应该做的是触发我的视图监听的某种事件。但是,我对你们的问题如下:我什么时候知道整个 foos 集合已经构建完毕,我在哪里附加监听器?
提前致谢!!