4

我有很多事件绑定到我的视图中的元素,但是当我使用stickit js 通过更改模型来更改视图中的值时,它不会触发 onChange 事件。

有没有一种方法可以在模型中设置值之后触发当前模型的 onchange 事件:元素,而不必为每个绑定编写处理程序?这将适用于所有表单元素,输入/选择/文本区域。

对于页面上的每个表单元素,我想避免以下内容:

bindings: {
    '#foo': {
         observe: 'foo',
         afterUpdate: 'forceChange'
    },
    '#bar': {
         observe: 'bar',
         afterUpdate: 'forceChange'
    },
    ...
},

forceChange: function(el) { jQuery(el).change() }
4

2 回答 2

5

一种可能的技巧(仅适用于 0.6.3 版)是定义一个匹配所有元素的全局处理程序:

Backbone.Stickit.addHandler({
  selector: '*',
  afterUpdate: function($el) {
    $el.trigger('change');
  }
});

由于处理程序按照定义的顺序与其他匹配的处理程序和绑定配置混合在一起,因此您不能afterUpdate在不覆盖这个全局的、全匹配的处理程序的情况下在任何绑定中使用,因为绑定配置是最后混入的. 你可以在这里阅读更多关于它的信息。

于 2013-03-26T12:24:55.010 回答
1

啊,那条评论澄清了问题。因此,在 Javascript 中,当您“手动”更改输入值时(无论是通过 jQuery 还是通过someElement.value =),正如您所注意到的,浏览器不会触发更改事件。更改事件(以及与此相关的大多数其他事件)仅在响应用户操作时触发,而不是针对 Javascript。

幸运的是,正如您可以“手动”更改值一样,您也可以“手动”触发事件。在 jQuery 中,它的语法是:

$(yourElement).trigger('change');

如果您需要控制类似的东西,e.target您可以阅读 jQuerytrigger文档以获取详细信息,但这是基本思想。

如果需要,您甚至可以将值更改和事件触发链接在一起:

$(yourElement).val('newValue').trigger('change');
于 2013-03-26T00:06:57.387 回答