我有一些事件委派在执行某些任务的输入上运行良好:
$("#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事件?
答案 0 :(得分:0)
A)仍然更新viewmodel但是它没有激活select的onchange事件,但是没有破坏依赖的observable?
从Knockout文档中:“如果您尝试设置无法在已填充的下拉列表中显示的模型值,请拒绝该更改,因为您不允许具有与可见的不一致的模型值UI选择。“此评论会在change
处理程序中触发value
事件之前显示。
因此,有两种可能性可以让您从程序化视图模型更新中获得change
事件:
您正在设置下拉列表中不存在的值。如果是这种情况,您可以在设置之前添加代码以检查该值是否有效。
您将值设置为数字类型,但下拉列表中的项目值是字符串。虽然Knockout将选择匹配项,但它会触发change
事件以指示observable需要更新为匹配的字符串值。如果是这种情况,您可以确保在设置observable时将值转换为字符串。
B)在上面的事件委托中嗅出并区分用户何时导致onchange事件和viewmodel更新导致onchange事件?
我无法确定哪些浏览器支持此功能,但该事件可能具有isTrusted
属性,您可以检查。参考:http://www.w3.org/TR/DOM-Level-3-Events/#h3_trusted-events