我们是怎么碰到这个的呢?基本上,我们在所有表单输入上都调用了trigger('change'),以让其他可观察对象知道其值已被重置。但是我真的认为这是 knockout 中的错误。在这里询问是否有人遇到过该问题(而StackOverflow是比Knockout的Google论坛更好的界面)。

因此,如果您有一个隐藏的输入,其值是数据绑定(bind)到计算的可观察值的对象,并且您对它调用了jQuery的trigger('change'),则它将消除该可观察值。如果深入研究代码,则可以看到在 View 模型对象上,在触发更改事件之前,成员对象已替换为计算出的可观察对象上的最后一个值的字符串。

JS小提琴展示了实际的破损:http://jsfiddle.net/2VvvE/1/

它使用console.log来输出对象,因此如果您尝试使用没有控制台的浏览器(咳嗽IE),请注意。您可以看到从属的Observable可以正常工作,直到您单击“Break It”按钮,此后,该值停止更新,并且随后按的输出相同的内容。如果注释掉上面带有trigger('change')的行并重新运行小提琴,则可以看到每次按下按钮后,它仍可继续工作。

道歉,不问一个真正的问题-我们已经想出了一个解决方案,可以在未隐藏的输入上仅调用trigger('change')(如果有人好奇,可以使用非常简单的jquery选择器):

$("#"+this.id+" form").each(function() {
    $(this).validate().resetForm();
    this.reset();

    // Do some actions on all the inputs, then filter before calling the trigger
    $(this).find('input,select').data('valid','true').filter(':not(:hidden)').trigger('change');
    $(this).find('label,legend').removeClass('validated-error');
});

但是我想下一个结论: knockout 错误?还是我做错了?

最佳答案

您不应将常规可计算的可观察对象与value之类的读/写绑定(bind)绑定(bind)。这导致它在模型中被覆盖。

如果需要,可以使用writeable computed observable。在这种情况下,您甚至可以拥有一个空白的写入功能:http://jsfiddle.net/rniemeyer/2VvvE/2/

实际的答案是,您确实不需要在字段上触发change事件。处理此问题的更好方法是从您的 View 模型执行此操作。在任何observablecomputed observable上,您都可以调用valueHasMutated()函数以用最新值再次通知所有订户。
myObservable.valueHasMutated()

09-09 22:04
查看更多