2016-12-26 21 views
0

私は、指定されたフォーマットのマネースペースを表示するためにbindingHandlerを作成しようとしています。しかし、私がその値を使用したいときは、再び浮動小数点にする必要があります。KnockOut Currency bindingHandler

たとえば、私が望むのは、考える

money = ko.observable(); 

money(1500000.75);

表示:このような1.500.000,75

私は使用しました。結合およびHTMLとして

<input class="actTextBox" placeholder="" data-bind="numericValue: money"> 

として

ko.bindingHandlers.numericValue = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     ko.utils.registerEventHandler(element, 'change', function (event) { 
      var observable = valueAccessor(); 
      var positions = ko.utils.unwrapObservable(allBindingsAccessor().positions) || ko.bindingHandlers.numericValue.defaultPositions; 

      if (ko.utils.unwrapObservable(allBindingsAccessor().positions) == 0) { 
       positions = 0; 
      } 

      if (isNaN(parseFloat($(element).val()))) 
       observable(0); 
      else { 
       if (!ko.utils.unwrapObservable(allBindingsAccessor().noDecimalPoints)) 
        observable(parseFloat($(element).val().replace(".", "").replace(",", ".")).toFixed(positions).replace(",", ".")); 
       else 
        observable(parseFloat($(element).val().replace(".", "").replace(",", ".")).toFixed(positions)); 
      } 
     }); 
    }, 
    update: function (element, valueAccessor, allBindingsAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     if (value != null) { 
      var positions = ko.utils.unwrapObservable(allBindingsAccessor().positions) || ko.bindingHandlers.numericValue.defaultPositions; 
      if (ko.utils.unwrapObservable(allBindingsAccessor().positions) == 0) { 
       positions = 0; 
      } 
      var formattedValue = parseFloat(value).toFixed(positions); 
      var finalFormatted = formattedValue; 
      if (!ko.utils.unwrapObservable(allBindingsAccessor().noDecimalPoints)) 
       finalFormatted = ko.bindingHandlers.numericValue.withCommas(formattedValue); 
      ko.bindingHandlers.value.update(element, function() { return finalFormatted; }); 
     } 
    }, 
    defaultPositions: 2, 
    noDecimalPoints: false, 
    withCommas: function (original) { 
     original += ''; 
     x = original.split('.'); 
     x1 = x[0]; 
     x2 = x.length > 1 ? ',' + x[1] : ''; 
     var rgx = /(\d+)(\d{3})/; 
     while (rgx.test(x1)) { 
      x1 = x1.replace(rgx, '$1' + '.' + '$2'); 
     } 
     return x1 + x2; 
    } 
}; 

。しかし、私が "1500000.43"と入力すると、私は何も見ません。私は空白を参照してください。

回答が見つかりませんでした。

+1

は、あなた自身を結合ハンドラを作成しましたか、それがどこかからコピーしたのですか? – Tomalak

答えて

1

私はmaskmoney jqueryプラグインとノックアウトカスタムバインディングを使用します。

ko.bindingHandlers.mask = { 

    init: function (element, valueAccessor, allBindingsAccessor) { 
     ko.bindingHandlers.mask.processar(element, valueAccessor, allBindingsAccessor); 
    }, 

    update: function (element, valueAccessor, allBindingsAccessor) { 
     var mask = valueAccessor(); 
     if (mask.tipo !== 'Currency') { 
      ko.bindingHandlers.mask.createMask(element, ko.bindingHandlers.mask.getObservable(mask.mascara)); 
     } 
    }, 

    getObservable: function (valor) { 
     if ($.isFunction(valor)) { 
      var res = valor(); 
      return $.isFunction(res) ? res() : res; 
     } else { 
      return valor; 
     } 
    }, 

    processar: function (element, valueAccessor, allBindingsAccessor) { 
     var mask = valueAccessor(); 
     var maxLeftDigits = mask.hasOwnProperty('maxLeftDigits') ? mask.maxLeftDigits : null; 
     var options = null; 
     if (maxLeftDigits !== null) { 
      options = { 
       maxLeftDigits: mask.maxLeftDigits 
      }; 
     } 

     switch (mask.tipo) { 
      case 'Currency': $(element).maskMoney(options, function (valor) { 
       if (mask.hasOwnProperty('value')) { 
        if (mask.value() !== null) { 
         mask.value(valor); 
        } 
       } 
      }); break; 
      default: 
       var mascara = ko.bindingHandlers.mask.getObservable(mask.mascara); 
       ko.bindingHandlers.mask.createMask(element, mascara); 
       break; 
     }; 
    } 

ダウンロード完全なソースコードhere

1

はこれを試してみてください:

ko.bindingHandlers.currency = { 
     update: function(element, valueAccessor){ 
      // retrieve observable value 
      var value = ko.utils.unwrapObservable(valueAccessor()) || 0; 
      //convert to number of string 
      value = + value; 
      //format currency 
      var formattedText = "$" + value.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, "$1,"); 
      //apply formatted text to the underlying DOM element 
      $(element).text(formattedText); 
     } 
    };