2014-11-07 1 views
0

내 응용 프로그램에 표시되는 동안 숫자를 서식 지정하는 데 numeric.js를 사용하고 있습니다. 그러나 형식을 적용하고 계산 된 관측 가능 값을 변경하려고 시도하면 입력 된 값이 형식화 된 값과 같으면 값이 업데이트되지 않습니다. http://jsfiddle.net/kwt8vy9u/5/Knocout js observable calculate updated가 업데이트되지 않았습니다.

var ChangeWrite = true; 
//Function to get first 2 non zero digits after decimal 

ko.bindingHandlers.number = { 
    update: function (element, valueAccessor, allBindingsAccessor, data) { 
     var observable = valueAccessor(), 
      formatted = ko.computed({ 
       read: function (key) { 
        ChangeWrite = false; 
        if (ko.isObservable(observable)) { 
         if (observable() || observable() === 0) { 
          var num = parseFloat(observable()); 
          return numeral(num).format('0,0.00'); 
         } 
        } else { 
         if (observable || observable === 0) { 
          var num = parseFloat(observable) 
          return numeral(num).format('0,0.00'); 
         } 
         return ''; 
        } 
       }, 
       write: function (value) { 
        if (ChangeWrite) { 
         var change = true; 
         if (value != valueAccessor()()) { 
          change = true; 
         } else { 
          change = false; 
         } 
         if (!isNaN(value) && value !== '' && change && value.indexOf('-') < 0) { 
          valueAccessor()(value); 
         } else { 
          if ((change || value.indexOf('-') >= 0) && $("#dgConfirm").is(':visible') == false) { 
           alert('please enter valid value'); 
          } 
          $(element).val(function() { 
           if (valueAccessor()() === '') return ''; 
           else { 
            var num = valueAccessor()() 
             return numeral(num).format('0,0.00'); 
           } 
          }()); 
         } 
        } else { 
         ChangeWrite = false; 
         $(element).val(function() { 
          if (valueAccessor()() === '') return ''; 
          else { 
           var num = valueAccessor()() 
           return numeral(num).format('0,0.00'); 
          } 
         }()); 

        } 

       }, 
       disposeWhenNodeIsRemoved: element 
      }).extend({ 
       notify: 'always' 
      }); 
     ko.applyBindingsToNode(element, { 
      value: formatted 
     }); 
    } 
}; 


$(document).ready(function() { 
    $("#txtOriginal").blur(function() { 
     ChangeWrite = true; 
    }); 

    function AppViewModel() { 
     this.value = ko.observable(10); 
    } 

    ko.applyBindings(new AppViewModel()); 
    ChangeWrite = true; 
}); 

예 : 여기

는 바이올린이다 나는 그것이 10.56 서식이 텍스트 상자에 10.562를 입력하고 기본 계산 관찰은 10.562 포함합니다. 그러나 값을 10.56으로 변경하면 기본 계산 된 관찰 가능 항목이 업데이트되지 않습니다. 그것은 여전히 ​​10.562를 사용하고 있습니다. 이 문제는 IE10과 크롬에서 볼 수 있습니다. 그것은 IE에서 제대로 < = 9

감사합니다,

프라 빈을하고있다.

+0

많은 코드가 있습니다. 노크 아웃 문제에 초점을 맞춰 예제를 간소화 할 수 있습니까? – JohnnyHK

+0

불필요한 코드를 제거하고 바이올린을 업데이트했습니다. – praveen

답변

0

나는 당신의 바이올린을 열어이 모든 코드를 대체 :

$('#txtOriginal').change(function() { 
    alert('Changed.'); 
}); 

을 그리고 텍스트 상자에 "1234"를 입력; '변경됨'을 얻었습니다. 경보.

나는 모든 텍스트를 삭제하고 "1234"를 다시 입력했으나 경고 메시지를받지 못했습니다.

이것을 바탕으로, 녹아웃이 변경된 이벤트를 얻지 못한다는 것을 알 수 있습니다. 즉, 관찰 대상이 변경 사항을 보지 못할 수도 있음을 의미합니다.

관련 문제