在我们遇到这个问题的背后有一些故事......基本上,我们调用trigger('change')
了我们所有的表单输入来让其他淘汰赛 observables 知道它们的值已被重置。但我真的认为这是 Knockout 中的一个错误。在这里询问是否有其他人遇到过它(并且 StackOverflow 是一个比 Knockout 的谷歌论坛更好的界面)。
因此,如果您有一个隐藏的输入,其值是数据绑定到计算的可观察对象,并且您在其上调用 jQuery trigger('change')
,它会清除可观察对象。如果您深入研究代码,您可以看到在视图模型对象上,在触发更改事件之前,成员对象被替换为计算出的 observable 上的最后一个值的字符串。
JS fiddle 展示了破损情况:http: //jsfiddle.net/2VvvE/1/
它使用console.log 输出对象,因此如果您尝试没有控制台的浏览器(咳嗽IE),请注意。你可以看到依赖的 observable 工作正常,直到你点击“Break It”按钮,之后,值停止更新,随后的按下输出相同的东西。如果您注释掉带有触发器('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');
});
但我想要一个结论:淘汰错误?还是我做错了?