2011-03-09 3 views
1

다른 이벤트를 처리하기 위해 knockoutjs를 사용하고 있습니다. 그 중 하나는 가격 입력란에 1,000 명의 분리자를 추가하려고합니다.knockoutjs에서 자체적으로 문제가되는 속성을 구독하고 있습니까?

그래서 가격 필드에 변경 이벤트를 등록하고 누락 된 분리자를 추가하고 가격 필드에 다시 기록하는 마술을합니다. 가격 필드에 다시 쓰기는 새로운 변경 이벤트를 트리거 때문에, 나는 루프 휴식을 체크 필요 - 값이 실제로 변경 한 경우 내가 물어 수행

this.listingPriceFormatted.subscribe(function (newValue, model) { 
     var cleanValue = newValue.toString().replace(/\D/g, ''); 
     $('#Price').val(cleanValue); 
     var outValue = MySite.Utilities.addThousandSeperator(cleanValue); 
     if (newValue != outValue) { 
      me.listingPriceFormatted(outValue); 
     } 
    }); 

나는 트리거별로 좋아하지 않아요 동일한 이벤트를 두 번만 사용하여 값을 한 번 설정하십시오. 이벤트를 다시 트리거하지 않고 필드에 다시 쓸 수있는 방법이 있습니까? 아니면이 모든 것을 잘못하고 있습니까?

답변

3

이 경우 writable dependentObservable에 바인딩하면 작업에 적합한 도구 일 것입니다. 이렇게하면 필드를 읽고 설정하는 방법을 제어 할 수 있습니다.

예를 들어, listingPrice가 관찰 가능하다면 listingPriceFormatted writeable dependentObservable을 가질 수 있습니다. 필드를 listingPriceFormatted에 바인드합니다. 당신은 GitHub의에서 코드의 최신 복사본을 사용해야합니다 그래서

viewModel.listingPriceFormatted = ko.dependentObservable({ 
    read: function() { 
       //add commas 
       return MySite.Utilities.addThousandSeperator(this.listingPrice()); 
      }, 
    write: function(newValue) { 
       //strip commas and store in listingPrice 
       this.listingPrice(MySite.Utilities.stripThousandSeperator(newValue)); 
      } 
    }, viewModel); 

이 기능은, 1.12 이후에 추가했다 : 그것은처럼 보일 것입니다. 희망이 도움이됩니다. http://www.knockmeout.net/2011/03/guard-your-model-accept-or-cancel-edits.html

+0

멋진 대답, 내가 찾던 excatly 무엇 :

또한,이 게시물의 끝에서, 당신에게 도움이 될 수있는 그 하나의 객체로 관찰 및 dependentObservable을 캡슐화하는 생각입니다. 녹아웃은 훌륭하지만, 개인적으로 나는 그것에 대한 문서를 탐색하는 데 문제가 있습니다 ... –

관련 문제