Javascript KnockoutJS:需要格式化可观察值(十进制)

Javascript KnockoutJS:需要格式化可观察值(十进制),javascript,knockout.js,Javascript,Knockout.js,我已经有一段时间没有使用Knockout了,在尝试将表单字段的输入值修剪到小数点后两位时遇到了一个问题。我创建了下面计算的可观测值,并通过我想用修剪值更新的可观测值订阅它。谁能告诉我我做错了什么 视图模型 HTML: 你是在调用ko.applyBindings方法吗?如果没有,您需要在代码末尾调用它。 我想你的想法是用小数点将小数位数限制在2位,然后PriceAdvanced会订阅更新后的小数点,对吗?但订阅不是这样的。计算的可观察对象监听其中的可观察对象,而订阅函数则监听可观察对象本身。因此,

我已经有一段时间没有使用Knockout了,在尝试将表单字段的输入值修剪到小数点后两位时遇到了一个问题。我创建了下面计算的可观测值,并通过我想用修剪值更新的可观测值订阅它。谁能告诉我我做错了什么

视图模型

HTML:

你是在调用ko.applyBindings方法吗?如果没有,您需要在代码末尾调用它。 我想你的想法是用小数点将小数位数限制在2位,然后PriceAdvanced会订阅更新后的小数点,对吗?但订阅不是这样的。计算的可观察对象监听其中的可观察对象,而订阅函数则监听可观察对象本身。因此,您的代码将处于一个永无止境的循环中。 而且我认为你只想限制小数位数,而不是位数本身,对吗?因此,我更改了代码,仅当存在小数点时才修剪值

function createViewModel() {
  var self = {};

  self.SalesRepId = ko.observable().extend({ required: true });
  self.PriceAdvanced = ko.observable("").extend({ required: true, min: 1, max: 200 });

  self.decimalValue = ko.computed(function () {
      var num = self.PriceAdvanced().indexOf(".") > -1?  self.PriceAdvanced().slice(0, (self.PriceAdvanced().indexOf(".")+3)): self.PriceAdvanced();
      //return num;
      self.PriceAdvanced(num);
  }).extend({ notify: "always" });
  return self;
}

ko.applyBindings(new createViewModel());

注意:您的扩展器最小值:1,最大值:200将不起作用,因为PriceAdvanced保存的是字符串而不是数字。

谢谢您,雷。这工作做得很好!但是,我仍然存在最小/最大验证的问题。关于如何在这种情况下工作,你知道吗?@DeanFriedland我不确定min和max是否是有效的扩展器,因为根据,你需要插件才能工作。如果没有这一点,您可能需要编写一个自定义扩展程序,就像在文档中一样。自定义扩展程序理想情况下也应该包括十进制限制器。是的,我们有验证插件/库,它就在那里。只是不确定它为什么不起作用。您也可以尝试将数字应用于PriceAdvanced,而不是字符串,并使用来限制小数位数。
<div class="form-group col-xs-12">
          <label class="label-col col-xs-4 control-label labelFormat" for="PriceAdvanced"><span class="warn">* </span>Advanced Criminal History Search</label>
          <div class="col-xs-8">
            <input class="form-control max225" type="text" id="PriceAdvanced" name="PriceAdvanced" data-bind="textInput: PriceAdvanced" size="23" placeholder="$0.00" />
          </div>
</div>
function createViewModel() {
  var self = {};

  self.SalesRepId = ko.observable().extend({ required: true });
  self.PriceAdvanced = ko.observable("").extend({ required: true, min: 1, max: 200 });

  self.decimalValue = ko.computed(function () {
      var num = self.PriceAdvanced().indexOf(".") > -1?  self.PriceAdvanced().slice(0, (self.PriceAdvanced().indexOf(".")+3)): self.PriceAdvanced();
      //return num;
      self.PriceAdvanced(num);
  }).extend({ notify: "always" });
  return self;
}

ko.applyBindings(new createViewModel());