2012-07-09 76 views
1

淘汰赛,我想有一个输入字段被自动格式化,非常相似,例如,此网页下可写已计算的观测量:计算场淘汰赛相同的值

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

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

谢谢。

回答

4

即使您写入的值没有改变,曾经有一段时间,即使写入时,observables也会始终通知。由于我相信KO 1.21,当它们的实际价值没有变化时,可观察的数据将会抑制通知。

简单的解决方案是,您可以调用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 
}); 

在这种情况下,我们只能写观察到当已解析的值是不同的,我们只会迫使通知时用户输入的值与当前值不同。即使用户输入一个将当前价格四舍五入的值,这也会导致该字段更新。

这里是更新的样本:http://jsfiddle.net/rniemeyer/6A4aN/

+0

工作就像一个魅力。谢谢一堆。 – Corence 2012-07-09 18:22:34