0

現在、バックボーン + 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 ミリ秒以上かかることがあり、コードは機能しません。

したがって、私がすべきことは、ビューがリッスンする何らかのイベントをトリガーすることだと思います。しかし、皆さんへの私の質問は次のとおりです: foo のコレクション全体が構築されたことはいつわかりますか? また、リスナーをどこにアタッチすればよいでしょうか?

前もって感謝します!!

4

0 に答える 0