计算字段淘汰相同的值

时间:2012-07-09 16:16:16

标签: javascript knockout.js

在Knockout中我试图让一个输入字段自动格式化,非常类似于Writable Computed Observables下此页面上的示例:

http://www.knockmeout.net/2011/03/reacting-to-changes-in-knockoutjs.html

我遇到的问题是,如果输入转换为相同内容的值(例如1.00和1.0),那么Knockout不会看到值已更改且不会更新格式(您可以使用示例在他的页面上看到)。我已经创建了一个hackjob解决方案,我们将字段更改为不同的字段,然后将其更改为触发Knockout中的更新,但我想知道是否有人有更合适的修复。

感谢。

1 个答案:

答案 0 :(得分:4)

有一段时间,即使你写的值没有改变,observable也会在写入时始终通知。由于我相信KO 1.21,当它们的实际值没有改变时,observables会抑制通知。

简单的解决方案是您可以在observable上调用valueHasMutated以确保发送通知。

编写计算的observable的更好方法是:

//writable computed to parse currency input 
this.editPrice = ko.computed({
    //return a formatted price
    read: function() {
        return viewModel.formatCurrency(this.price());
    },
    //if the value changes, make sure that we store a number back to price
    write: function(newValue) {
        var current = this.price(),
            valueToWrite = viewModel.parseCurrency(newValue);

        //only write if it changed
        if (valueToWrite !== current) {
            this.price(valueToWrite);
        } else {
            //if the rounded value is the same, but a different value was written, force a notification for the current field
            if (newValue !== current) {
                this.price.valueHasMutated();
            }
        }
    },
    owner: this
});

在这种情况下,我们只会在解析的值不同时写入observable,我们只会在用户输入的值不同于当前值时强制通知。即使用户输入一个舍入当前价格的值,这也会导致该字段更新。

以下是更新后的示例:http://jsfiddle.net/rniemeyer/6A4aN/