1

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

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

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

谢谢。

4

1 回答 1

4

曾经有一段时间,observables 在写入时总是会通知,即使您正在写入的值没有改变。由于我相信 KO 1.21,当实际值没有改变时,可观察对象会抑制通知。

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

编写计算的 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/

于 2012-07-09T17:35:13.480 回答