ここで少し調べたところ、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});
};
したがって、このようにコレクションの初期化メソッドを作成すると、
initialize: function() {
console.log('hello collection!');
}
helloコレクションがモデルからのhelloの前にログに記録されていることに気付くでしょう。したがって、モデルの初期化は、 -callのreset
後の関数から行う必要があります。コレクションにモデルが渡されない限り呼び出されません。一見しただけでは実行されていないように見えますが、実際にはinitialize
rest
var m = new Bar({});
バックボーンは{}
をモデルとして解釈し、関数で初期化しreset
ます。しかし{}
、あなたが言うモデルではありませんか?ええと、Backboneはそれについてあまりうるさくはありません。モデル属性を含めることができる、または含めることができないハッシュの配列が必要なだけです。reset
-functionは最終的に-functionにつながり、add
最終的にすべての道路はローマに行き_prepareModel
ます。
_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を読むことを心から宣伝しています。