【问题标题】: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?

标签: javascript data-binding knockout.js


【解决方案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' 使其更新任何操作(粘贴、拖放、清除字段等...)
  • afterkeydown 在 iOS 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" />

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 2021-09-24
    • 2016-07-27
    • 1970-01-01
    • 2013-08-02
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多