LoginSignup
5
5

More than 5 years have passed since last update.

Backbone.jsのModelとCollectionに同じイベント名をつけてはまったこと

Posted at

Collectionに紐付けされたModel双方に同じイベント名をつけてModelのイベントにはひも付いたView単体のイベント、Collectionには関連View全てのイベントを発行するということをしたかったのですが上手くいきませんでした。

上手くいかないというかModel側からイベントを呼び出すとCollectionのイベントも呼び出されます

Backbone.js側を読み込んでいくとCollection側に
Modelを追加する際にmodelのイベントを全て読み取る_onModelEventというプロキシが設定されていました。

Backbone.js
    _onModelEvent: function(event, model, collection, options) {
      if ((event === 'add' || event === 'remove') && collection !== this) return;
      if (event === 'destroy') this.remove(model, options);
      if (model && event === 'change:' + model.idAttribute) {
        delete this._byId[model.previous(model.idAttribute)];
        if (model.id != null) this._byId[model.id] = model;
      }
      this.trigger.apply(this, arguments);
    }
  });

この仕組みによってModelのイベントは一部を除いてCollectionでも発行されるみたいです。

一応動いているがイベント発行数が合わないと悩まされていた箇所がようやく解決した気がします・・・。(書き換えないといけない箇所がたくさんある・・・)

知っていれば部分的に上書きするなりCollection側をModelの挙動に合わせたイベントを設定すれば問題なく動きそうです。

詳細はBackbone.jsのannotated source codeを参照。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5