2011-09-14 6 views
8

knockout j 및 미국 외 지역을 사용하여 계산을 처리하는 방법을 알 수 없습니다. 내 쉼표는 jquery.globalization 플러그인을 사용하여 올바르게 검증되지만 녹아웃 계산은 나에게 NaN을 제공합니다. 녹아웃 js가 어떤 방식 으로든이를 지원합니까, 아니면 모든 대안이 존재합니까?녹아웃 js 및 세계화

예 :

포맷 금액 필드 소수점 값을 허용하고 글로벌 (콤마 기호 등), 입력 및 출력을 허용 녹아웃 JS 현장 작업에 cartEditor 예를 확인

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

nb-NO 문화권을 사용하여 사이트를 실행 중이며 모델 바인더가 쉼표로 예상되어 있기 때문에 asp.net mvc 3 사이트에서 작업하려면이 항목이 필요합니다.

+0

는 최신 autoNumeric 버전 (1.9.x)와 호환되도록 수정? 필요한 경우 jquery.globalization API 호출을 사용하는 빠른 사용자 정의 바인딩을 작성할 수 있습니다. –

+0

@RP Niemeyer 환상적인 도움! 나는 당신이 주변에 있다는 것을 알면서 지금 그것을 사용할지도 모른다. – balexandre

답변

7

서식 지정을 위해 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 바인딩 외모를 사용하여 바인딩 :

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

체크 아웃 autoNumeric.js에게 다양한 옵션을 사용자가 설정 ewith 무엇을 할 수 있는지에 서식합니다.

2

는 샘플이 있나요

(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이면 항상 참을 리턴합니다. 이러한 치명적인 업데이트 루프는 예를 들어 빈 배열을 값으로 갖는 ko.mapping을 사용하여 모델 데이터를 받으면. 이 피들보기 http://jsfiddle.net/jham/sd95e/ – jham