一种可能的解决方案是使您的视图依赖于 的状态fetch
,因此在您的模型/集合完成加载之前它不会被实例化。
请记住,这是一个 Backbone 反模式。使视图依赖于您的集合/模型可能会导致 UI 延迟。这就是为什么推荐的方法是通过直接在页面中内联 json 来引导数据。
但这并不能解决您的情况,您需要在无服务器情况下引导数据。使用几行 Ruby/PHP/etc 将 json 数据动态嵌入页面很容易,但如果您只在客户端工作,则使视图依赖于模型是可行的方法。
如果您使用 加载集合fetch()
,则可以使用以下内容:
var Model = Backbone.Model.extend({});
var Collection = Backbone.Collection.extend({
model: MyModel,
url: 'http://localhost:8080/json/items.json'
});
var View = Backbone.View.extend({
//code
});
var myCollection = new Collection();
myCollection.fetch({
success: function () {
console.log('Model finished loading'); }
myView = new View();
});
我的首选方法是使用 ajax(例如 , .getJSON
).ajax
并将返回的 jqXHR 对象(或 XMLHTTPRequest,如果您不使用 jQuery)保存到模型中的属性中。这样您就可以进行更精细的控制,并且可以在创建视图之前使用延迟对象响应来检查调用的状态。
var Model = Backbone.Model.extend({});
var Collection = Backbone.Collection.extend({
model: Model,
status: {},
initialize: function () {
var _thisCollection = this;
this.status = $.getJSON("mydata.json", function (data) {
$.each(data, function(key) {
var m = new Model ( {
"name": data[key].name,
"value": data[key].value,
} );
_thisCollection.add(m);
});
});
}
});
var View = Backbone.View.extend({
console.log( "Creating view...");
//code
});
var myCollection = new Collection();
var myView = {};
myCollection.status
.done(function(){
console.log("Collection successfully loaded. Creating the view");
myView = new View();
})
.fail(function(){
console.log("Error bootstrapping model");
});