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

Posted

技术标签:

【中文标题】如何有条件地绑定到 knockout.js 中的“valueUpdate”?【英文标题】:How do I conditionally bind to "valueUpdate" in knockout.js? 【发布时间】:2019-01-13 18:54:30 【问题描述】:

我目前正在使用 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'。到底是怎么回事?

【问题讨论】:

这是一个完整的黑暗拍摄,试试这个valueUpdate: (Name.isModified() ? 'afterkeydown' : '') @Ray 感谢您的评论,但遗憾的是它似乎没有任何不同。 不建议使用value 绑定来处理valueUpdate 的情况。根据他们建议使用textInput 绑定的文档:检查Note 1 in:knockoutjs.com/documentation/value-binding.html 【参考方案1】:

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

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

您的第二个示例是您想要动态更改该绑定参数时的方法,但在您的情况下,我认为您没有正确执行。

Knockout-validation 验证器附带一个选项来定义 onlyIf 回调,以允许您运行/停止验证。 您想要做的是在该onlyIf 回调中评估一个可观察对象,并在您想要的情况下将该可观察对象设置为真(在输入模糊或其他任何情况下) onlyIf docs

【讨论】:

该死。我确实认为是这样的。我想我只是要创建一个使用 语法而不是 onlyIf 语法的组件,因为看起来我需要将 onlyIf 添加到每个经过验证的属性中,而它似乎并不一样干净。非常感谢。我已将此标记为已接受的答案。 取决于你想要制作这个东西的正确程度,从长远来看,我建议你不要使用这样的无容器组件,有时性能可能会差 6 倍......也是 onlyIf场景非常干净,当定义具有时间概念的验证时,而不是“始终运行”,其非常干净的编码将其定义在与验证器相同的“行”上,使事情保持紧凑和有条理!好吧,这是 javascript,它们可能有几十种方法来解决它:P

以上是关于如何有条件地绑定到 knockout.js 中的“valueUpdate”?的主要内容,如果未能解决你的问题,请参考以下文章

有条件地在 knockout.js 中添加元素属性

Knockout.js 条件绑定

Knockout JS 如何将数据绑定到静态表单元素

使用 knockout.js 将 Flash 新项目添加到 dom 中的数组

如何在动态添加的内容中绑定 knockout.js 中的事件?

单选按钮的 knockout.js 布尔数据绑定问题