5

jQuery 1.7.2とBackbone.jsを使用して、入力が値を変更したときにイベントを発生させたいだけです。

現在、私は以下を持っています(これは機能します)

MyView: Backbone.View.extend({
  initialize: function() {

    this.colorInput = $("<input />", {
         "id": "color",
         "name": "color",
         "value": this.model.get("color")
    });

    var self = this;
    this.colorInput.on("change", function() {
      self.changeColor();
    });

  },
  changeColor: function() {
    var color = this.colorInput.val();
    this.model.set("color", color);
  }
});

関数を渡すだけの別の方法でそれを実行しようとしていました。

this.colorInput.on("change", this.changeColor, this);

しかし、そのようにしようとすると、エラーがスローされます

((jQuery.event.special [handleObj.origType] || {})。handle || handleObj.handler).applyは関数ではありません
.apply(matched.elem、args);

3332行目

私はそれを理解することができません。この方法が機能しない理由はありますか?

4

2 に答える 2

11

あなたはjQueryonを混乱させています:

.on(events [、selector] [、data]、handler(eventObject))
.on(events-map [、selector] [、data])

バックボーンon付き:

object.on(event、callback、[context])

バックボーンは3番目の引数としてコンテキストを取りますが、jQueryは取りません。jQueryonは3番目の引数をとして解釈し、handler(eventObject)それを関数のように呼び出そうとしているようです。これにより、表示されているエラーメッセージが説明されます。

通常は、次のようにします。

MyView: Backbone.View.extend({
  events: {
    'change input': 'changeColor'
  },
  initialize: function() {
    this.colorInput = $("<input />", {
       "id": "color",
       "name": "color",
       "value": this.model.get("color")
    });
  },
  render: function() {
    this.$el.append(this.colorInput);
    return this;
  },
  changeColor: function() {
    var color = this.colorInput.val();
    this.model.set("color", color);
  }
});

そして、Backboneのイベント委任システムに処理を任せます。

于 2012-06-13T22:01:14.700 に答える
3

これは、この問題に遭遇した Google 社員向けです。これとまったく同じ問題が発生しましたが、エラーが報告された場所と実際にエラーが発生した場所が2つの異なる場所にあった.

1行のコードが廃止され、次のようになりました

$('#modal').on('click', function(e) {
   // Execute invalid code here.
});

他のコード行も同様でした:

$('#modal').on('click', function(e) {
   // Execute valid code here.
});

エラーは、最初の呼び出しが真の関数ではなかったため、エラーは正確であり、呼び出された 2 番目のハンドラーは真の関数ではなく、jQuery はそれを完了できませんでしたが、常に 2 番目の関数呼び出しで発生したかのように動作しました。 .

このエラーが発生した場合は、トリガーされる可能性のある余分なイベント ハンドラーを削除して、問題が解決するかどうかを確認してください。

于 2015-06-14T14:42:44.713 に答える