为什么挖空不会更新我的文本框中的值

Why won't knockout update the value in my textbox?

本文关键字:文本 我的 更新 为什么      更新时间:2023-09-26

(这是我遇到的一个非常简化的问题的例子。它可能没有太多的功能意义(

我需要一个可以键入货币的文本框,它将转换为视图模型上的 int 和文本框中格式良好的值

我从中获取了代码

示例 4:筛选和验证用户输入

并扔掉了lastInputWasValid和NaN测试。

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

如果我键入 1234,则acceptedNumericValue的值将为 1234,文本框中的值将为 €1234。好!

如果我键入 €567.0,则acceptedNumericValue的值将为 567,文本框中的值将为 €567。明!

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

我明白这个:)所以我会给淘汰赛一脚,并在acceptedNumericValue上打电话给valueHasMutated让它发挥作用

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

为什么!? :'(

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

此行为是设计使然,您必须在计算中使用 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。

从文档中:

当计算的可观察量返回基元值(数字、字符串、布尔值或 null(时,通常只有在值实际更改时才会通知可观察量的依赖项。但是,可以使用内置的 notify 扩展器来确保计算可观察量的订阅者始终在更新时收到通知,即使值相同也是如此。