(这是我遇到的一个问题的极其简化的例子。它可能没有太大的功能意义)
我需要一个可以输入货币的文本框,它将转换为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?
答案 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。
当计算的observable返回原始值(数字,字符串,布尔值或空值)时,通常仅在值实际更改时才通知observable的依赖项。但是,可以使用内置的
notify
扩展程序来确保计算的observable的订阅者始终在更新时得到通知,即使该值是相同的。