如何有条件地绑定到 knockout.js 中的 "valueUpdate"?

How do I conditionally bind to "valueUpdate" in knockout.js?

我目前正在使用 knockout.js 和 knockout.validation.js 插件,它在大多数情况下都运行良好。我一直在努力的是让验证在输入模糊时第一次触发,然后每次都在每次击键的基础上触发。我真的觉得下面的代码应该适用于此。

<input type="text" class="form-control"
       data-bind="value: Name, 
           valueUpdate: Name.isModified() ? 'afterkeydown' : '',
           style: { background: Name.isModified() ? 'red' : 'green'}" 
/>

由于某些原因,当 isModified() 更改时,valueUpdate 不会更改为 afterkeydown,但背景颜色确实会像我预期的那样正确更改。 (那行代码只是为了帮助调试)。

当 isModified 可观察值发生变化时,我做错了什么导致 valueUpdate 方法无法正确更新?

编辑:

我想我问这个问题可能做得不好。我想知道的是为什么这段代码没有:

<input type="text" class="form-control"
       data-bind="value: Name, 
           valueUpdate: Name.isModified() ? 'afterkeydown' : ''"
/>

像这样的代码:

<!-- ko if: Name.isModified() -->
    <input type="text" 
           class="form-control" 
           data-bind="value: Name, valueUpdate: 'afterkeydown'" />
<!-- /ko -->
<!-- ko if: !Name.isModified() -->
    <input type="text" class="form-control" data-bind="value: Name" />
<!-- /ko -->

在我看来你不能有条件地绑定到 "valueUpdate" 属性 并且我无法在任何淘汰文档中证实这一点。在第一种情况下,Name.isModified 更新时 valueUpdate 不会更改为 'afterkeydown'。到底是怎么回事?

This 是 Knockout 的 value 绑定的定义。 在第 14 行以上,您将开始看到附加到元素的初始事件处理程序。 'change' 与任何其他定义的处理程序一起附加,例如 valueUpdate 请求的处理程序。

不幸的是(或没有),如您所见,它们在输入初始化期间被获取并执行一次,因此当您尝试更改绑定的值时它没有任何效果,Knockout 中没有任何东西在监视它。

你的第二个例子是当你想动态改变那个绑定参数时的方法,但在你的情况下我认为你没有正确地做。

Knockout-validation 验证器带有一个选项来定义 onlyIf 回调,以允许您进行 run/stop 验证。 你想要做的是在那个 onlyIf 回调中评估一个可观察的,并在你想要的情况下将那个可观察的设置为真(输入模糊或其他任何东西) onlyIf docs