【问题标题】:Differentiate Change Event vs. Update Knockout ViewModel区分更改事件与更新淘汰视图模型
【发布时间】:2014-02-02 23:23:40
【问题描述】:

我有一些事件委托在执行某些任务的输入上效果很好:

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

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

在另一种方法中,我正在以编程方式为一些相同的输入字段更新视图模型。

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

问题是当我以编程方式为选择字段更新视图模型时,它似乎也触发了更改事件并触发了我不想要的上述事件委托。

是否可以:

A) 仍然更新视图模型,但不会触发 select 的 onchange 事件,但不会破坏依赖的 observables?

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

【问题讨论】:

    标签: javascript knockout.js viewmodel onchange


    【解决方案1】:

    A) 仍然更新视图模型,但不会触发 select 的 onchange 事件,但不会破坏依赖的 observables?

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

    因此,您会从编程视图模型更新中获得change 事件的原因有两种:

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

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

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

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

    【讨论】:

    • 干得好,我正在用一个 int 作为选择值更新视图模型。 .toString'ing 它解决了这个问题。谢谢!!非常感谢您的帮助。
    猜你喜欢
    • 2015-07-07
    • 2012-07-25
    • 2019-11-14
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2014-08-18
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多