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(事件,回调,[上下文])

Backbone 将上下文作为第三个参数,而 jQuery 则没有。看起来 jQueryon正在将您的第三个参数解释为 thehandler(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

这是给遇到这个问题的谷歌人的。我遇到了完全相同的问题,发生的事情是报告错误的位置和实际发生错误的位置在两个不同的地方。

一行代码已过时,看起来像

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

另一行代码类似:

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

错误是第一次调用不是真正的函数,所以错误是准确的,被调用的第二个处理程序不是真正的函数,jQuery 无法完成它,但它总是表现得好像它发生在第二个函数调用上.

我会说,如果您遇到此错误,请删除任何可能触发的额外事件处理程序,看看是否可以解决问题。

于 2015-06-14T14:42:44.713 回答