敲除可观察字段未在输入值更改时更新

Posted

技术标签:

【中文标题】敲除可观察字段未在输入值更改时更新【英文标题】:Knockout observable field not updating on input value change 【发布时间】:2013-01-10 20:11:16 【问题描述】:

我注意到我无法让某些 Knockout 现场教程或基本示例能够演示可观察数据绑定。

这是我的代码:

<!DOCTYPE html> 
<html lang="en">

<html>
    <head>
        <meta charset="utf-8" />
        <title>Testing</title>
        <script type="text/javascript" src="knockout.js"></script>
        <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript">
            function TestViewModel() 
                this.Name = ko.observable("Testing");
            

            $(function() 
                ko.applyBindings(new TestViewModel());
            );
        </script>
    </head>

    <body>
        <h1>Testing Knockout.js</h1>
        <div>
            <div>
                <span data-bind="text: Name"></span>
            </div>
            <div>
                <input type="text" data-bind="value: Name"></input>
            </div>
        </div>
    </body>
</html>

因此,当我在 Google Chrome 或 Firefox 中打开它时,我希望 span 标签的值会随着我更改输入中的文本而改变,但事实并非如此。有人可以解释为什么上述方法不起作用吗? (这段代码几乎是从网站上的文档中复制而来的)

谢谢, 亚历克斯。

【问题讨论】:

您的代码看起来运行良好:jsfiddle.net/FHGvy。你用的是什么版本的淘汰赛和 jquery? 【参考方案1】:

从 KO 版本 3.2 开始(正如 Salvador Dali answer's 指出的那样),您应该使用 textinput binding 进行即时更新:

<input data-bind="textInput: userName" />

如果您使用的是早期的 Knockout 版本和 value 绑定,那么您应该进行以下更改:

默认情况下,敲除会在更改事件上更新可观察对象的值(例如,当文本框的焦点丢失时)。

如果您想要即时更新,您需要指定valueUpdate 选项,其中可能的事件是:keyupkeypressafterkeydown 请参阅documentation 中的更多信息。

所以改变你的value绑定:

<input type="text" data-bind="value: Name, valueUpdate: 'afterkeydown'"></input>

演示JSFiddle.

【讨论】:

啊,我现在觉得很傻,只是假设这将是一个 insta 更新并且我做错了什么。 @Alex:你并不孤单。更改输入字段中的值(而不是取消焦点)时,我也对缺乏更新感到震惊。这主要归功于 this really good video tutorial with Steve Sanderson,我发现它足够快,没有发布相同的问题 ;-) 使用 valueUpdate: 'input' 使其更新任何操作(粘贴、拖放、清除字段等...) afterkeydownios 7 上无法可靠运行,请参阅 github.com/knockout/knockout/issues/1118 伙计们,请阅读以下答案。 textInput 是今天解决这个问题的方法。【参考方案2】:

接受的答案是正确的,但在新的 KO 版本 3.2 中,他们添加了 textinput binding. 因此,您可以使用 textInput 代替 value 绑定:

<input data-bind="textInput: userName" />

它做了两件重要的事情:

立即更新 处理剪切、拖动、自动完成的浏览器差异...

【讨论】:

非常感谢您的留言!在我的应用程序中几乎所有地方我都添加了 valueUpdate 以进行即时更新,这个新的绑定让生活更轻松。【参考方案3】:

对于那些在这里徘徊的人(像我一样)想知道为什么它不起作用。请注意您额外的“()”用法。这让我遇到了这样的嵌套可观察对象:

不好:

<input data-bind="textInput: subItem().userName()" />

好:

<input data-bind="textInput: subItem().userName" />

【讨论】:

以上是关于敲除可观察字段未在输入值更改时更新的主要内容,如果未能解决你的问题,请参考以下文章

KnockoutJS:模板未在可观察数组更改时更新(仅在添加时,在删除时有效)

Knockoutjs 单击并编辑字段不更新可观察的

点亮的 Web 组件未在属性更改时更新

输入未更改时观察者未触发更新事件 - Laravel

React js,如何在输入更改时更新状态对象值? [复制]

Redux - 异步 - 输入字段更改时的 POST 状态