hatora's blog

日常の出来事や仕事のことなど/Java/開発/Web/IT

【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