Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript KnockoutJS强制计算的可观察对象重新计算_Javascript_Knockout.js - Fatal编程技术网

Javascript KnockoutJS强制计算的可观察对象重新计算

Javascript KnockoutJS强制计算的可观察对象重新计算,javascript,knockout.js,Javascript,Knockout.js,我对KnockoutJS还不熟悉,我认为到目前为止它是一个很棒的工具:)!然而,我有一个关于计算的观测值的问题,如下所示。在的KnockoutJS页面上,有一个用于格式化价格的示例代码。代码如下 HTML <p>Enter bid price: <input data-bind="value: formattedPrice"/></p> 我还复制了代码,并在此处放置了一个JSFIDLE: 我的问题是,当您输入相同的内容两次时,该值不会自动更新。例如: 步骤1

我对KnockoutJS还不熟悉,我认为到目前为止它是一个很棒的工具:)!然而,我有一个关于计算的观测值的问题,如下所示。在的KnockoutJS页面上,有一个用于格式化价格的示例代码。代码如下

HTML
<p>Enter bid price: <input data-bind="value: formattedPrice"/></p>
我还复制了代码,并在此处放置了一个JSFIDLE:

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

步骤1:输入25.1234,它变成$25.12 第二步:再次输入25.1234。现在什么也没发生

我的猜测是,该值没有改变,因此不会重新格式化。我能知道我该怎么处理这个问题吗


谢谢

这是敲除中的优化,如果将可观察值设置为相同的值,则不会触发更改的事件

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

this.price(isNaN(value) ? 0 : value); // Write to underlying storage
this.price.valueHasMutated();
它本身不会修复您的代码,因为在ko 3.0中为
ko.computed
引入了另一个优化,因此如果计算值保持不变,并且您需要使用
.extend({notify:'always'})

因此,计算的完整工作时间如下所示:

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'});

演示。

非常感谢!我看到了这一点,但没有意识到这是答案,哈哈。还有一个问题,当我试图以这种方式使用计算的观测值时,我发现它通常会导致我的字段在编辑时自动更新。因此,我需要使用hasFocus,然后使用一个简单的if检查。然而,在上面的示例代码中,我发现在编辑字段时,字段本身从未得到更新。为什么会这样?我以为是所有者的地盘,但事实似乎并非如此。。。谢谢我不太明白你的问题。这张照片是如何聚焦的?你能不能制作一个新的小提琴来显示你现在的问题?
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'});