【问题标题】:KnockoutJS Forcing A Computed Observable to Re-ComputeKnockoutJS 强制计算的 Observable 重新计算
【发布时间】:2014-04-17 19:34:51
【问题描述】:

我是 KnockoutJS 的新手,我认为到目前为止它是一个很棒的工具 :)!但是,我有一个关于计算的 observables 的问题,如下所示。在http://knockoutjs.com/documentation/computedObservables.html 的KnockoutJS 页面上,有一个用于格式化价格的示例代码。代码如下。

HTML
<p>Enter bid price: <input data-bind="value: formattedPrice"/></p>

还有 JS:

JS
function MyViewModel() {
    this.price = ko.observable(25.99);
 
    this.formattedPrice = ko.computed({
        read: function () {
            return '$' + this.price().toFixed(2);
        },
        write: function (value) {
            // Strip out unwanted characters, parse as float, then write the raw data back to the underlying "price" observable
            value = parseFloat(value.replace(/[^\.\d]/g, ""));
            this.price(isNaN(value) ? 0 : value); // Write to underlying storage
        },
        owner: this
    });
}
 
ko.applyBindings(new MyViewModel());

我也复制了代码并在这里放了一个jsFiddle:http://jsfiddle.net/wDvxw/

我的问题是,当您输入两次相同的内容时,该值不会自行更新。例如:

第 1 步:输入 25.1234,变为 $25.12 第 2 步:再次输入 25.1234。现在什么都没有发生。

我的猜测是该值没有改变,因此它不会重新格式化自己。我可以知道如何解决这个问题吗?

谢谢!

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    这是 Knockout 中的一项优化,如果您将 observable 设置为相同的值,它不会触发更改的事件。

    因此,如果您想始终触发更改事件,则需要使用valueHasMutated 方法手动触发它:

    this.price(isNaN(value) ? 0 : value); // Write to underlying storage
    this.price.valueHasMutated();
    

    它本身不会修复您的代码,因为在 KO 3.0 中为 ko.computed 引入了另一种优化,因此如果计算值保持不变并且您需要使用 .extend({notify: 'always'}) @,则计算也不会触发更改987654321@

    所以完整的工作计算将如下所示:

    this.formattedPrice = ko.computed({
       read: function () {
          return '$' + this.price().toFixed(2);
       },
       write: function (value) {
          value = parseFloat(value.replace(/[^\.\d]/g, ""));
          this.price(isNaN(value) ? 0 : value); // Write to underlying storage
          this.price.valueHasMutated();
        },
        owner: this
    }).extend({notify: 'always'});
    

    演示JSFiddle.

    【讨论】:

    • 非常感谢!我看过这个,但没有意识到这是答案,哈哈。
    • 还有一个问题,当我尝试以这种方式使用计算的 observables 时,我发现它通常会导致我的字段在我编辑它时自行更新。因此,我需要使用 hasFocus,然后使用简单的 if 检查。但是,在上面的示例代码中,我发现该字段本身在我编辑它时永远不会更新。为什么会这样?我以为是所有者字段,但似乎并非如此......谢谢!
    • 我并没有真正关注你的问题。这个hasFocus是如何出现的?您可以创建一个新的小提琴来显示您现在的问题吗?
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 2020-12-10
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2014-07-03
    • 2018-11-22
    • 2014-02-27
    相关资源
    最近更新 更多