0

我目前正在使用 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 集合已经构建完毕,我在哪里附加监听器?

提前致谢!!

4

0 回答 0