нокаут глобальная пользовательская привязка - PullRequest
0 голосов
/ 28 ноября 2018

Требуется отформатировать суммы, отображаемые на всех страницах.Это мой код для пользовательского связывания.

(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 голосов
/ 29 ноября 2018

Вот то, что работает.Одна из проблем, которую я обнаружил, заключалась в том, что 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" />
...