2011-09-14 11 views
8

Knockout js ve bize yerel olmayan ayarları kullanarak hesaplamaları nasıl ele alacağımı anlayamıyorum. Komutum, jquery.globalization eklentisini kullanarak doğru bir şekilde doğrulanıyor, ancak nakavt hesaplaması bana bir NaN veriyor. Nakavt js bunu herhangi bir şekilde destekliyor mu yoksa herhangi bir geçici çözüm var mı?knockout js ve globalization

Örnek:

biçimlendirme miktarı alanında ondalık değerler sağlayan ve küreselleşmiş (virgül işareti olarak) giriş ve çıkışı sağlayan knockout js ŞANTİYEDEGüney cartEditor örnek yapmak

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

Bir asp.net mvc 3 sitesinde çalışmak için buna ihtiyacım var çünkü nb-NO kültürünü kullanarak siteyi çalıştırıyorum ve model ciltleyici, virgül işareti bekliyor gibi, virgül işareti olarak bekliyor

+0

en son autoNumeric sürümü (1.9.x) ile uyumlu hale getirmek için Modifiye? Gerekirse, jquery.globalization API çağrılarını kullanmak için hızlı özel bir ciltleme yazabiliriz. –

+0

@RP Niemeyer fantastik yardım! Şimdi kullanmaya başlayabilirim, senin yanında olduğunu bilerek :) – balexandre

cevap

7

Biçimlendirme için autoNumeric.js'u sarılmış özel bir ciltleme yazarak böyle bir şey yaptım. (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); 
      } 
     } 
    }; 
} 

veriler böyle bu özel autoNumeric bağlayıcı görünüyor kullanarak bağlanma:

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

Kontrol dışarı autoNumeric.js geniş seçenekler ayarlarda ewith neler yapabileceğini görmek için biçimlendirme için.

2

Bir örnek elinde

(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

Sizler benim günümü kurtardınız. Güncelleme işleyicisinde NaN'ye karşı kontrol etmeyi de unutmayın. Özellikle çünkü "(newValue! = ElementValue);" 'newValue' ve 'elementValue' her ikisi de NaN ise her zaman doğru döner. Böyle ölümcül güncelleme döngüsü, ör. ko.mapping değerini kullanarak boş diziye sahip model verilerini alırsanız. Bu keman bakın http://jsfiddle.net/jham/sd95e/ – jham