7

バックボーン 0.9.0 の変更ログには次のように書かれています。

ビューのイベント ハッシュには、既存のビュー メソッドの文字列名だけでなく、関数の直接値も含めることができるようになりました。

次のことを試してみると、イベントの値が であると言って失敗しますundefined

var BB = Backbone.View.extend({
  'initialize': function() {

    this.$el.html('<input type="button" value="Click me!" />');
    jQuery('body').html(this.el);
  },

  'events': {
    'click input[type="button"]': this.buttonClicked
  },

  'buttonClicked': function() {
    alert('button clicked!');
  }

});

window.b = new BB()

新しい機能を誤解していますか? 誰かが私が思っていたのとは違う仕組みを説明できますか? おそらく、私の JavaScript 構文/定義時の 'this' の値が壊れているだけです。

私が慣れている方法はまだ機能します:

'events': {
  'click input[type="button"]': 'buttonClicked'
},
4

1 に答える 1

14

JavaScript パーサーがここに到達すると:

'events': {
  'click input[type="button"]': this.buttonClicked
},

thisはおそらくwindowであり、期待どおりのインスタンスではありませんBBwindowオブジェクトにはプロパティがありません(buttonClicked少なくともあなたの場合はありません)ので、あなたは本当にこれを言っています:

'events': {
  'click input[type="button"]': undefined
},

そしてあなたのエラーがあります。

のソースをdelegateEvents見ると、ChangeLog の意味がわかります。

delegateEvents: function(events) {
  // ...
  for (var key in events) {
    var method = events[key];
    if (!_.isFunction(method)) method = this[events[key]];
    // ...
  }
},

その_.isFunction呼び出しは、あなたが興味を持っているものです。つまり、次のように言うことができます。

events: {
  'click input[type="button"]': function() { alert('pancakes!') },
  'click button': some_function_that_is_in_scope
}

そのため、定義済みの関数を (アクセス可能な場合は名前で、または関数リテラルとして)eventsルックアップ テーブルに入れることができます。

于 2012-02-02T19:27:11.973 に答える