現在、バックボーン + 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 のコレクション全体が構築されたことはいつわかりますか? また、リスナーをどこにアタッチすればよいでしょうか?
前もって感謝します!!