经过一番调查,我发现,Backbone.Collection 函数如下:
var Collection = Backbone.Collection = function(models, options) {
options || (options = {});
if (options.model) this.model = options.model;
if (options.comparator !== void 0) this.comparator = options.comparator;
this._reset();
this.initialize.apply(this, arguments);
if (models) this.reset(models, {silent: true, parse: options.parse});
};
因此,如果您像这样为您的 Collection 创建一个初始化方法
initialize: function() {
console.log('hello collection!');
}
您会注意到 hello 集合记录在模型的 hello 之前。所以模型初始化必须来自-callreset
之后的函数。除非您将模型传递到您的收藏中,否则不会被调用,您乍一看似乎没有这样做,但实际上在initialize
rest
var m = new Bar({});
Backbone 将 解释{}
为模型,因此在reset
-function 中对其进行初始化。但是{}
你说的不是模特吗?嗯,Backbone 对此并不太挑剔,它只需要一个可以包含或不包含模型属性的哈希数组。-functionreset
最终导致add
-function 最终所有道路都通向罗马,或者我应该说_prepareModel
-function
_prepareModel: function(attrs, options) {
if (attrs instanceof Model) {
if (!attrs.collection) attrs.collection = this;
return attrs;
}
options || (options = {});
options.collection = this;
var model = new this.model(attrs, options);
if (!model._validate(model.attributes, options)) return false;
return model;
}
这里发生的情况是,集合检查它是否已通过模型或属性散列,在属性散列的情况下,它只是根据其定义的模型创建一个新模型并传递该散列。
希望这不仅能解决问题,还能进一步阐明那里发生的事情。当然,我也热忱地提倡大家阅读骨干源代码,最糟糕的 OG 文档。