2014-05-22 5 views
1

쉼표로 구분 된 숫자의 서식을 지정하는 Knockout bindingHandler를 만들어야했습니다. 조금 검색 한 후 here (솔루션에 @nemesv에게 감사함)을 찾았습니다. 변환을 위해 http://numeraljs.com/을 사용합니다. 다음과 같이knockout bindingHandler (쉼표로 구분 된 동일한 번호의 항목을 다시 텍스트 상자에 입력)

바인더는 다음과 같습니다

ko.bindingHandlers.formatMoney = { 
    init: function(element, valueAccessor) { 

    var value = valueAccessor(); 

    var interceptor = ko.computed({ 
     read: function() { 
      return numeral(ko.unwrap(value)).format('0,0.00'); 
     }, 
     write: function(newValue) { 
      if($.trim(newValue) == '') 
       value("0"); 
      else 
       value(numeral().unformat(newValue)); 
     } 
    }).extend({ notify: 'always' }); 

    if(element.tagName.toLowerCase() == 'input') 
     ko.applyBindingsToNode(element, { 
      value: interceptor 
     }); 
    else 
     ko.applyBindingsToNode(element, { 
      text: interceptor 
     }); 
    } 
} 

나는 그것을 사용하고 정상적인 경우에 완벽하게 작동합니다. 하지만 텍스트 상자와 함께 사용할 때 수정해야합니다.

관측 값이 실제로 사용되고있는 경우에만 통보되는 관측 가능성이 사용된다는 것이 문제입니다. 매번 다른 값을 입력하면 실제 포맷터가 적용됩니다. 예를 들어

  • 처음으로 1234를 입력하고 텍스트 상자에 포커스가 없으면 1,234.00으로 변환됩니다.
  • 이제 텍스트 상자에 1234를 다시 입력하십시오. 작동하지 않고 바인더의 read 메서드가 호출되지 않습니다.

관찰 가능 값이 동일해도 항상 interceptor'sread 메서드를 실행하려면 어떻게해야합니까?

샘플 바이올린 : http://jsfiddle.net/vEcSq/4/

감사합니다.

답변

3

observable에 대해 valueHasMutated 함수를 사용하여 변경되지 않았더라도이를 변경 한 가입자에게 경고 할 수 있습니다. interceptorwrite 함수에서 다음 행을 함수의 마지막 행으로 추가하십시오.

value.valueHasMutated(); 

나는 전화와 updated your jsfiddle을 가지고 올바르게 작동하는 것 같군.

+0

고맙습니다. Robert. 이것이 내가 필요한 것입니다. – Aamir