区分更改事件与更新Knockout ViewModel

时间:2014-01-14 18:41:20

标签: javascript knockout.js viewmodel onchange

我有一些事件委派在执行某些任务的输入上运行良好:

$("#myParentWrapperId").delegate("input,textarea,select", 'change keypress', function (e) {
 //runStuff();
});

<select data-bind="value:MyVM.MyPropValue"></select>

在另一种方法中,我正在以编程方式更新某些相同输入字段的viewmodel。

self.MyListItems()[idx].MyVM.MyPropValue(data.MyVM.MyPropValue);

问题是当我以编程方式为select字段更新viewmodel时,它似乎也触发了change事件并触发了我不想要的上述事件委托。

是否可以:

A)仍然更新viewmodel但是它没有激活select的onchange事件,但是没有破坏依赖的observable?

B)在上面的事件委托中嗅出并区分用户何时导致onchange事件和viewmodel更新导致onchange事件?

1 个答案:

答案 0 :(得分:0)

  

A)仍然更新viewmodel但是它没有激活select的onchange事件,但是没有破坏依赖的observable?

从Knockout文档中:“如果您尝试设置无法在已填充的下拉列表中显示的模型值,请拒绝该更改,因为您不允许具有与可见的不一致的模型值UI选择。“此评论会在change处理程序中触发value事件之前显示。

因此,有两种可能性可以让您从程序化视图模型更新中获得change事件:

  1. 您正在设置下拉列表中不存在的值。如果是这种情况,您可以在设置之前添加代码以检查该值是否有效。

  2. 您将值设置为数字类型,但下拉列表中的项目值是字符串。虽然Knockout将选择匹配项,但它会触发change事件以指示observable需要更新为匹配的字符串值。如果是这种情况,您可以确保在设置observable时将值转换为字符串。

  3.   

    B)在上面的事件委托中嗅出并区分用户何时导致onchange事件和viewmodel更新导致onchange事件?

    我无法确定哪些浏览器支持此功能,但该事件可能具有isTrusted属性,您可以检查。参考:http://www.w3.org/TR/DOM-Level-3-Events/#h3_trusted-events