【Backbone.js】modelとcollectionの紐付け
Marionette.jsでmodelEvent・collectionEventをBehaviorで共通管理したい場合。
例えば'error'イベントをハンドルすると、modelとcollectionの両方でイベントがハンドルされてしまい困ってました。
modelがcollectionに属していればスルーする的な方法で解決できないかと思い、ソースをちょこっと読解。
*1
Backbone.js
collectionはmodelを保持しているので、まずはその管理方法の部分から調べてみました。
_addReference
_addReference: function(model, options) { this._byId[model.cid] = model; var id = this.modelId(model.attributes); if (id != null) this._byId[id] = model; model.on('all', this._onModelEvent, this); }
modelのcidでまずは紐付けて、idAttributeの値で再度紐付けています。
_prepareModel
_prepareModel: function(attrs, options) { if (this._isModel(attrs)) { if (!attrs.collection) attrs.collection = this; return attrs; } options = options ? _.clone(options) : {}; options.collection = this; var model = new this.model(attrs, options); if (!model.validationError) return model; this.trigger('invalid', this, model.validationError, options); return false; }
collectionプロパティを付与して、バリューにcollectionの参照を指定しています。
まとめ
ということで、if (model.collection)とかでチェックすればいけそうな感じがしたけど、他になんかいい方法ないのだろうか
*1:Backbone.jsのバージョンは1.1.2