javascript - 在隐藏值上调用 jQuery .trigger ('change' ) 会破坏依赖于 knockout 的可观察对象

标签 javascript jquery knockout.js

我们是如何遇到这个问题的背后有一些故事......基本上,我们在我们所有的表单输入上调用 trigger('change') 让其他 knockout observables 知道它们的值(value)被重置。但我真的认为这是 knockout 中的一个错误。在这里询问是否有人遇到过它(StackOverflow 的界面比 Knockout 的谷歌论坛好得多)。

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

JS fiddle 显示了运行中的破损:http://jsfiddle.net/2VvvE/1/

它使用 console.log 输出对象,因此如果您尝试使用没有控制台的浏览器( IE),请注意。您可以看到依赖的 observable 工作正常,直到您点击“Break It”按钮,之后,该值停止更新并且后续按下输出相同的内容。如果您注释掉带有 trigger('change') 的行并重新运行 fiddle,您可以看到它在每次按下按钮后继续工作。

很抱歉没有问一个真正的问题 - 我们已经想出了一个解决方法,我们只在没有隐藏的输入上调用 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 错误?还是我做错了?

最佳答案

你不应该将一个普通的计算可观察对象绑定(bind)到一个读/写绑定(bind)上,比如 value。这导致它在您的模型中被覆盖。

如果必须,您可以使用 writeable computed observable .在这种情况下,您甚至可以使用空白写入函数:http://jsfiddle.net/rniemeyer/2VvvE/2/

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

myObservable.valueHasMutated()

关于javascript - 在隐藏值上调用 jQuery .trigger ('change' ) 会破坏依赖于 knockout 的可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11853303/

相关文章:

javascript - Knockout.js 中嵌套 View 模型和 json

javascript - 如何在 bootstrap multiselect(Knockout 绑定(bind))中实现 optgroups

javascript - Bootstrap 和占位符

javascript - 如何在外部存储 javascript 变量(没有服务器)的值?

javascript - 将outerHTML 视为 jQuery 对象

javascript - 在按钮单击事件上绑定(bind) dxSelectBox

javascript - 如何正确应用KO绑定(bind)下面的例子

javascript - DataTable 如何防止在包含超链接的列中单击行

javascript - 将数据放入对象中

javascript - 将值(value)从焦点传递到模糊功能的最佳方式?