为什么赢得淘汰更新文本框中的值?

时间:2014-12-19 16:49:21

标签: javascript knockout.js

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

我需要一个可以输入货币的文本框,它将转换为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,并且不会更新文本框。

我得到了这个:)所以我会给予淘汰赛,并在valueHasMutated上拨打acceptedNumericValue以使其正常工作

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

为什么!? :'(

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

1 个答案:

答案 0 :(得分: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返回原始值(数字,字符串,布尔值或空值)时,通常仅在值实际更改时才通知observable的依赖项。但是,可以使用内置的notify扩展程序来确保计算的observable的订阅者始终在更新时得到通知,即使该值是相同的。