【问题标题】:Why won't knockout update the value in my textbox?为什么淘汰赛不会更新我的文本框中的值?
【发布时间】:2015-02-18 15:30:17
【问题描述】:

(这是我遇到的问题的一个极其简化的示例。它可能没有太多的功能意义)

我需要一个可以在其中输入货币的文本框,它将转换为 viewmodel 上的 int 并在文本框中转换为格式良好的值

我的代码来自

Example 4: Filtering and validating user input

并扔掉了 lastInputWasValid 和 NaN 测试。

我的结果在这里:http://jsfiddle.net/cvv341ro/8

如果我输入 1234,acceptedNumericValue 的值将是 1234,文本框中的值将是 €1234。好!

如果我输入 €567.0,acceptedNumericValue 的值为 567,文本框中的值为 €567。太棒了!

但是,如果我然后键入 567.0000(与接受的值相同),则敲除将向 acceptedNumericValue 写入一个已经存在的值,并且不会更新文本框。

我明白了 :) 所以我会踢一脚淘汰赛,然后在 acceptedNumericValue 上致电 valueHasMutated 以使其发挥作用

我可以看到正在调用计算,但无论我做什么,文本框都不会将文本更改为 567 欧元。

为什么!? :'(

非常简短的回顾:运行 jsfiddle -> 将文本更改为 123.0 -> 模糊 -> 为什么文本框不会更新为 €123?

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    此行为是设计使然,您必须在计算时使用 notify 扩展器,以触发重新计算,即使值没有变化 (123.0 == 123):

    this.attemptedValue = ko.pureComputed({
        read: function() {
            return "€" + this.acceptedNumericValue();
        },
        write: function (value) {
            value = parseInt(value.replace("€", ""));
            this.acceptedNumericValue(value);
            this.acceptedNumericValue.valueHasMutated();
        },
        owner: this
    }).extend({notify: 'always'});
    

    演示JSFiddle.

    来自documentation

    当计算的 observable 返回原始值(数字、字符串、布尔值或 null)时,通常仅在值实际更改时才通知 observable 的依赖关系。但是,可以使用内置的 notify 扩展器来确保计算的 observable 的订阅者总是在更新时得到通知,即使值相同。

    【讨论】:

    • 太棒了,谢谢你,我现在依稀记得这一点,但我自己永远也想不通。谢谢!
    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 2017-05-17
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多