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);
}
});
文档