2011-09-14 14 views
8

Nie mogę zrozumieć, jak obsługiwać obliczenia za pomocą nokautu js i non locale. Mój przecinek jest i jest poprawnie sprawdzany za pomocą wtyczki jquery.globalization, ale obliczenia nokautu dają mi NaN. Czy nokaut obsługuje to w jakikolwiek sposób, czy też istnieją jakieś obejścia?nokaut i globalizacja

przykład:

Dodać przykład cartEditor pracy na miejscu nokaut js umożliwiając wartości po przecinku, w zakresie ilości oraz umożliwiając wejście globalna (, jak przecinek znaku) i wyjście formatowania

http://knockoutjs.com/examples/cartEditor.html

Potrzebuję tego do pracy na stronie asp.net mvc 3, ponieważ uruchamiam witrynę przy użyciu kultury nb-NO, a model spoiwa oczekuje, jako znak przecinka

+0

Masz próbkę? W razie potrzeby możemy napisać szybkie niestandardowe powiązanie, aby używać wywołań interfejsu API jquery.globalization. –

+0

@RP Niemeyer fantastyczna pomoc! Mogę zacząć używać go teraz, wiedząc, że jesteś w pobliżu :) – balexandre

Odpowiedz

7

Zrobiłem coś takiego, pisząc niestandardowe powiązanie, które zapakował do formatowania autoNumeric.js. wiązanie (gist)

ko.bindingHandlers.autoNumeric = function ($) { 

    function getElementValue(el) { 
     return parseFloat(el.autoNumericGet(), 10); 
    } 

    function getModelValue(accessor) { 
     return parseFloat(ko.utils.unwrapObservable(accessor()), 10); 
    } 

    return { 
     init: function (el, valueAccessor, bindingsAccessor, viewModel) { 
      var $el = $(el), 
       bindings = bindingsAccessor(), 
       settings = bindings.settings, 
       value = valueAccessor(); 

      function updateModelValue() { 
       value(getElementValue($el)); 
      }; 

      $el.autoNumeric(settings); 
      $el.autoNumericSet(getModelValue(value), settings); 
      $el.change(updateModelValue); 
     }, 
     update: function (el, valueAccessor, bindingsAccessor, viewModel) { 
      var $el = $(el), 
       newValue = getModelValue(valueAccessor()), 
       elementValue = getElementValue($el), 
       valueHasChanged = (newValue != elementValue); 

      if ((newValue === 0) && (elementValue !== 0) && (elementValue !== "0")) { 
       valueHasChanged = true; 
      } 

      if (valueHasChanged) { 
       $el.autoNumericSet(newValue); 
       setTimeout(function() { $el.change() }, 0); 
      } 
     } 
    }; 
} 

dane za pomocą tego zwyczaju autoNumeric spojrzenia wiążące tak:

<input data-bind="autoNumeric:amount, settings:{aSign:'$'}" /> 

odjazdu autoNumeric.js rozbudowane opcje formatowania, aby zobaczyć, co można zrobić ewith ustawieniach.

2

Modified to aby był on zgodny z najnowszą wersją autoNumeric (1.9.x)

(function($) { 

    function getElementValue(el) { 
     return parseFloat(el.autoNumeric('get'), 10); 
    } 

    function getModelValue(accessor) { 
     return parseFloat(ko.utils.unwrapObservable(accessor()), 10); 
    } 

    ko.bindingHandlers.autoNumeric = { 
     init: function (el, valueAccessor, bindingsAccessor, viewModel) { 
      var $el = $(el), 
       bindings = bindingsAccessor(), 
       settings = bindings.settings, 
       value = valueAccessor(); 

      function updateModelValue() { 
       value(getElementValue($el)); 
      }; 

      if (settings.pSign === 's') { 
       settings.aSign = ' ' + settings.aSign; 
      } else { 
       settings.aSign = settings.aSign + ' '; 
      } 

      $el.autoNumeric(settings); 
      $el.autoNumeric('set', getModelValue(value)); 
      $el.change(updateModelValue); 
     }, 
     update: function (el, valueAccessor, bindingsAccessor, viewModel) { 
      var $el = $(el), 
       newValue = getModelValue(valueAccessor()), 
       elementValue = getElementValue($el), 
       valueHasChanged = (newValue != elementValue); 

      if ((newValue === 0) && (elementValue !== 0) && (elementValue !== "0")) { 
       valueHasChanged = true; 
      } 

      if (valueHasChanged) { 
       $el.autoNumeric('set', newValue); 
       setTimeout(function() { $el.change() }, 0); 
      } 
     } 
    }; 
})(jQuery); 
+2

Uratowaliście mi mój dzień. Nie zapomnij również sprawdzić naNN w procedurze aktualizacji. Zwłaszcza, że ​​"(newValue! = ElementValue);" zwróci zawsze wartość true, jeśli "newValue" i "elementValue" mają wartość NaN. Taka śmiertelna pętla aktualizacji może wystąpić np. jeśli otrzymasz dane modelu za pomocą ko.mapping posiadające pustą tablicę jako wartość. Zobacz ten skrzypek http://jsfiddle.net/jham/sd95e/ – jham

Powiązane problemy