4

在我们遇到这个问题的背后有一些故事......基本上,我们调用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');
});

但我想要一个结论:淘汰错误?还是我做错了?

4

1 回答 1

4

您不应该将普通的计算 observable 绑定到像value. 这导致它在您的模型中被覆盖。

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

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

myObservable.valueHasMutated()

于 2012-08-07T20:51:53.057 回答