敲除全局自定义绑定

时间:2018-11-28 09:12:49

标签: javascript knockout.js custom-binding ko-custom-binding

要求是格式化所有页面上显示的金额。这是我的自定义绑定代码。

(function () {
    function refresh(element, valueAccessor) {
        var val = ko.utils.unwrapObservable(valueAccessor());
        $(element).text(getCultureSpecificAmount(val));
    }
    ko.bindingHandlers.currency = {
        init: refresh,
        update: refresh
    }
})();

这是格式化金额的方法(不太相关,但仍在过帐中)

function getCultureSpecificAmount(number) {
var result = 0;
var regex = /[+-]?\d+(?:\.\d+)?/g;
var tempNumber = number;

if (match = regex.exec(number.toString())) {
    tempNumber = match[0];
}

result = (parseFloat(tempNumber)).toLocaleString(culture, { maximumFractionDigits: currencyDecimalDigits, minimumFractionDigits: 0 });
return (number.toString()).replace(tempNumber, result);

}

这是来自cshtml,以显示我是如何绑定它的

 <span style="font-weight:bold" data-bind="currency:PurchaseOrderValue"></span>

getCultureSpecificAmount 方法是使用通用js编写的。目前,我正在为每个js编写用于自定义绑定的代码。如果我将此代码移到common.js,则它将停止工作。 在每个页面上编写此代码会使代码看起来很难看。有没有一种方法全局定义自定义绑定并在所有页面上使用它。 这是我的淘汰赛项目,所以我一无所知。

1 个答案:

答案 0 :(得分:0)

这是可行的方法。我发现的问题之一是if(match = regex.exec(...))需要移到if(...)语句之外,但是除此之外,下面的代码基本上是相同的,因此您并不是很遥远工作正常。

function getCultureSpecificAmount(number) {
  var result = 0;
  var regex = /[+-]?\d+(?:\.\d+)?/g;
  var tempNumber = number;

  var match = regex.exec(number.toString());
  if (match != null) {
    tempNumber = match[0];
  }
  var culture = "en-AU";
  var currencyDecimalDigits = 2;
  result = (parseFloat(tempNumber)).toLocaleString(culture, {
    maximumFractionDigits: currencyDecimalDigits,
    minimumFractionDigits: 0
  });
  return (number.toString()).replace(tempNumber, result);
}

function refresh(element, valueAccessor) {
  var val = ko.utils.unwrapObservable(valueAccessor());
  $(element).text(getCultureSpecificAmount(val));
}
ko.bindingHandlers.currency = {
  init: refresh,
  update: refresh
}

var vm = {
  PurchaseOrderValue: ko.observable(3596.94985)
};

ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<label>Purchase Order Total</label>
<span style="font-weight:bold" data-bind="currency:PurchaseOrderValue"></span>
<br/>
<label>Edit Purchase Order Total</label>
<input  data-bind="textInput: PurchaseOrderValue" />