fetch
メソッドは、AJAXの非同期性に基づいて非同期です。したがって、イベント駆動型の動作を実装する必要があります。
X.fetch({
success: function(collection, response) {
hidePreLoader();
renderViews(collection); // collection argument is your X collection.
}
});
アップデート
私の答えに対するあなたのコメントに基づいて、私は別のアイデアを提案することができます。つまり、設定することができます
X.isLoaded = true;
またはのような他のプロパティ
X.loadedAt = Date.now();
success
コールバックで、他のコードがこのプロパティの状態をチェックできるようにします。
しかし、私はここで一種の悪いデザインを見ますが。プリローダーを表示してビューをレンダリングでき、success
コールバックトリガーで、ビューが読み込まれて使用できるようになったため、コレクションでビューが機能し始めるイベントがトリガーされます。したがって、全体として、イベント駆動型の動作を使用することを再度提案します。
私はテストしませんでしたが、ここに私の考えの表現があります:
var XCollection = Backbone.Collection.extend({
// ...
model: X,
loadState: {},
loadedAt: -1,
initialize: function(options) {
_.extend(this.loadState, Backbone.Events);
},
isLoaded: function() {
return this.loadedAt > -1;
}
});
var Subview = Backbone.View.extend({
// ...
initialize: function(options) {
this.collection.loadState.on("loadComplete",
this.onLoadComplete, this);
},
onLoadComplete: function(response) {
this.hidePreloader();
this.renderData();
},
/**
* Checks is the collection loaded and view can render fetched models.
* It's just an example.
* You'll not need to use it if you're handling a loadComplete event.
*/
isRenderingAllowed: function() {
return this.collection.isLoaded();
}
});
var XView = Subview.extend({
// ...
initialize: function(options) {
Subview.prototype.initialize.apply(this, arguments);
}
});
var YView = Subview.extend({
// ...
initialize: function(options) {
Subview.prototype.initialize.apply(this, arguments);
}
});
// ...
var x = new XCollection();
var xView = new XView({collection: x}),
yView = new YView({collection: x});
x.fetch({
success: function(collection, response) {
collection.loadedAt = Date.now();
collection.loadState.trigger("loadComplete", response);
}
});
ドキュメンテーション