我如何有条件地绑定到kickout.js中的“ valueUpdate”?

时间:2018-08-06 18:53:27

标签: knockout.js knockout-validation

我目前使用的是kickout.js和kickout.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”。到底是怎么回事?

1 个答案:

答案 0 :(得分:1)

This是淘汰赛的value绑定的定义。 在第14+行,您将开始看到附加到元素的初始事件处理程序。 附加了“更改”以及其他任何定义的处理程序,例如valueUpdate请求的处理程序。

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

您的第二个示例是您要动态更改该绑定参数的方法,但就您而言,我认为您没有正确执行此操作。

敲除验证器带有定义onlyIf回调的选项,以允许您运行/停止验证。 您想要做的是在该onlyIf回调中评估一个可观察值,并在所需的情况下将该可观察值设置为true(在输入模糊或其他情况下) onlyIf docs