我可能在这里完全遗漏了一些东西,但我有以下几点:
- 封装“所有”数据的模型(从一个 URL 加载的所有 JSON)
- 该模型有一个(或多个)集合,它正在使用它在构建时获得的数据进行实例化
- 初始化和加载数据时我想在集合上运行的一些代码
我的问题是关于组合的集合。我可以在 Collection 范围之外执行此操作,但我宁愿封装它(否则将其设为具有初始化程序等的“类”有什么意义)。
我以为我可以将该代码放入
initialize()
函数中,但该代码在填充模型之前运行,因此我无权访问包含集合的模型(this.models
为空)。然后我以为我可以绑定到一个事件,但是初始化后没有触发任何事件。如果我从它自己的端点加载集合,它们将是
fetch
,但我没有这样做,我正在从预先存在的数据初始化集合。
我的问题:如何在使用数据初始化后立即在 Collection 上运行初始化代码(即this.models
不为空)。
是否可以在不涉及“外部”代码的情况下做到这一点?
好的,这里是演示代码,也许这会更好地解释事情。
var Everything = Backbone.Model.extend({
url: "/static/data/mydata.json",
parse: function(data)
{
this.set("things", new Things(data.things, {controller: this}));
}
});
var Thing = Backbone.Model.extend({
});
var Things = Backbone.Collection.extend({
model: Thing,
initialize: function(data, options)
{
// HERE I want access to this.models.
// Unfortunately it has not yet been populated.
console.log("initialize");
console.log(this.models);
// result: []
// And this event never gets triggered either!
this.on("all", function(eventType)
{
console.log("Some kind of event happend!", eventType);
});
}
});
var everything = new Everything();
everything.fetch();
// Some manual poking to prove that the demo code above works:
// Run after everything has happened, to prove collection does get created with data
setTimeout(function(){console.log("outside data", everything.get("things").models);}, 1000);
// This has the expected result, prints a load of models.
// Prove that the event hander works.
setTimeout(function(){console.log("outside trigger", everything.get("things").trigger("change"));}, 1000);
// This triggers the event callback.