Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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を参照。

mozquito
最近はtypescriptいじってます。 perl html/css javascriptなど雑多に使います。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away