0

バックボーンのソースをハッキングしましたが、これを改善するための提案を探しています。

メソッドのソースは次のdelegateEventsとおりです。

delegateEvents: function (events) {
  if (!(events || (events = _.result(this, 'events')))) return;
  this.undelegateEvents();
  for (var key in events) {
    var method = events[key];
    if (!_.isFunction(method)) method = this[events[key]];
    if (!method) throw new Error('Method "' + events[key] + '" does not exist');
    var match = key.match(delegateEventSplitter);
    var eventName = match[1],
      selector = match[2];
    method = _.bind(method, this);
    eventName += '.delegateEvents' + this.cid;
    if (selector === '') {
      this.$el.on(eventName, method);
    } else {
      this.$el.on(eventName, selector, method);
    }
  }
},

これが私がハッキングしたものです(まだ本番環境の準備ができていませんよね?):

delegateEvents: function (events) {
  if (!(events || (events = _.result(this, 'events')))) return;
  this.undelegateEvents();
  for (var key in events) {
    var method = events[key];
    var special = false;
    if (method.indexOf('REF->') != -1) {
      special = true;
    } else {
      if (!_.isFunction(method)) method = this[events[key]];
      if (!method) throw new Error('Method "' + events[key] + '" does not exist');
    }
    var match = key.match(delegateEventSplitter);
    var eventName = match[1],
      selector = match[2];
    if (!special) method = _.bind(method, this);
    eventName += '.delegateEvents' + this.cid;
    if (selector === '') {
      if (!special) this.$el.on(eventName, method);
    } else {
      if (special) {
        var specialMethod = method.replace('REF->', '');
        eval('this.$el.on(eventName, selector, ' + specialMethod + ');');
      } else {
        this.$el.on(eventName, selector, method);
      }
    }
  }
},

ユースケース:

ビューからロジックを削除するか、ビュー外の関数にリダイレクトするだけでした。理由は簡単です。ビューだけでなく、ページの観点から考えているのです。これを容易にするために、マリオネット レイアウトを実際に使用しています。各レイアウトには複数のビュー チャンクが含まれており、ページ上のすべてのビュー委任を 1 か所にまとめたいと考えていました。

したがって、これが標準の場合:

View = Backbone.View.extend({
  events: {
    "click li.foo": "fooSelected"
  },
  fooSelected: function (e) {

  }
});

ハックは次のように機能します。

View = Backbone.View.extend({
  events: {
    "click li.foo": "REF->MyApp.Page.fooSelected"
  }
});

先に進む前に、これを分離するより良い方法はありますか?

4

1 に答える 1

0

この行if (!_.isFunction(method)) method = this[events[key]];では、ビュー オブジェクトのメソッド キーではなく、呼び出す関数を指定したかどうかを Backbone が既にチェックしています。このフィドルを参照してください: http://jsfiddle.net/h4eWn/

また、Marionette を使用すると、ビュー トリガーを使用して、レイアウトで View.on("fooSelected") をリッスンできます。

于 2013-03-02T01:47:33.763 に答える