2013-07-18 18 views
0

我见过有很多关于小数精度和在Javascript中显示的问题。事情是,我来到了一个解决方案,我认为这对我来说就足够了'Javascript删除小数在淘汰赛中的绑定

关键是我试图解析一个字符串,然后回到数字使用这样的表达式。

return parseFloat(num.toFixed(2)); 

但也有一些情况下,它不能按预期方式工作。说实话,我不确定它是否与我使用ko或JavaScript代码解析我的方式有关。但是,让我们假设在下面的小提琴中,您在上面的文本框中键入14.385,这两个字段将被正确舍入并显示正确的小数位数,但不删除您添加的数字3333(表示14.393333),上面的那个赢得不要圆整。这只是一个例子,因为有一些奇怪的行为。

哟可以看到这里的小提琴http://jsfiddle.net/RTexF/

感谢

编辑。我添加的代码按judgeja指示(我不明白要问一个代码的原因,当你链接小提琴,我现在看到了吧)

脚本

var decimalValue = 0.25; 

function ViewModel() { 
    var self = this; 

    self.submittedValue = ko.observable(decimalValue); 

    self.percentage = ko.computed({ 
     read: function() { 
      alert('read'); 
      if (isNaN(parseFloat(self.submittedValue()))) 
       return ''; 

      var num = self.submittedValue() * 100; 
      return parseFloat(num.toFixed(2)); 

     }, 
     write: function(value) { 
      alert('write'); 
      value = isNaN(value) ? '' : parseFloat((value/100).toFixed(4)); 
      self.submittedValue(value); 
     }, 
     owner: self 
    }); 
} 

ko.applyBindings(new ViewModel()); 

和HTML

<p><input data-bind="value:percentage"></input></p> 
<p><input data-bind="value:submittedValue"></input></p> 

编辑:

知道这是一个古老的一个,但我想指出,加入这write方法

self.percentage.notifySubscribers(value); 

修复该问题(理想情况下,我们可以核对当前值,只是notifiy如果它实际上改变)

小提琴:http://jsfiddle.net/RTexF/1/http://jsfiddle.net/RTexF/2/

+0

您应该在您的问题中发布jsfiddle代码,因为已知jsfiddle会不时停下来。 – James

回答

0

它可以帮助你想一想,如果你把一个alert("read")中读取:alert("write")中写入:然后再次运行您的示例。

当您更改机顶盒第一次底盒通过写入,然后将机顶盒重新计算为submittedValue观察到已经改变,你会看到的百分比阅读被击中。

下一次您编辑机顶盒的写,因为我们正在改变的价值,这是有道理的将再次袭来,但由于submittedValue没有改变,那么不会再发生因为它所依赖的可观察性不会改变。