2011-09-14 31 views
8

我不知道如何處理計算使用淘汰賽js和非我們的區域設置。我的逗號是,並使用jquery.globalization插件正確驗證,但敲除計算給我一個NaN。淘汰賽js是否以任何方式支持這一點,還是存在任何解決方法?淘汰賽js和全球化

實施例:

使在敲除JS現場工作允許十進制值在數量字段並允許全球化輸入(作爲逗號符號)和輸出格式化cartEditor示例

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

我需要這個在asp.net mvc 3網站上工作,因爲我正在使用nb-NO文化和模型綁定程序正在運行網站,因爲逗號爲

+0

你有一個樣本?如有必要,我們可以編寫一個快速的自定義綁定來使用jquery.globalization API調用。 –

+0

@RP尼邁耶夢幻般的幫助!我可能會開始使用它,知道你在附近:) – balexandre

回答

7

我通過編寫自定義綁定來包裝autoNumeric.js進行格式化,從而做了這樣的事情。格式化,看你能做些什麼ewith設置

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

退房autoNumeric.js廣泛的選擇:(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); 
      } 
     } 
    }; 
} 

數據使用這個自定義autoNumeric結合看起來像這樣綁定。

2

修改它,使之與最新版本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

你們救了我的一天。不要忘記在更新處理程序中檢查NaN。特別是因爲「(newValue!= elementValue);」如果'newValue'和'elementValue'都是NaN,將總是返回true。這種致命的更新循環可能會發生,例如如果您使用具有空數組作爲值的ko.mapping接收模型數據。看到這個小提琴http://jsfiddle.net/jham/sd95e/ – jham