Stickit:如何在每个模型之后触发更改事件 - >观点变化

时间:2013-03-25 03:45:28

标签: backbone.js backbone-stickit

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

有没有办法可以为当前模型触发onchange事件:在模型中设置值后的元素,而不必为每个绑定编写处理程序?这适用于所有表单元素input / select / textarea。

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

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

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

2 个答案:

答案 0 :(得分:5)

一个可能的hack(仅限0.6.3版本)将定义一个匹配所有元素的全局处理程序:

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

由于处理程序与其他匹配处理程序和绑定配置按照定义的顺序混合在一起,因此您无法在任何绑定中使用afterUpdate而不会覆盖此全局,全匹配处理程序,因为绑定配置是最后一个混合。您可以阅读更多相关信息here

答案 1 :(得分:1)

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

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

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

如果您需要控制e.target之类的内容,可以阅读jQuery trigger文档以获取详细信息,但这是基本想法。

如果您愿意,甚至可以将价值变化和事件触发链接在一起:

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