2012-07-31 2 views
4

난 그냥, 녹아웃에 새로 온 사람과 나는 쇼핑 카트 편집기가이 모든에서 오른쪽 또는하지만들기 녹아웃 가입자 끄고 다시

을하고있어 알고하지 않는 전원을 켭니다 더 진보 된 제품 선택기을 갖고 싶다는 사실을 제외하고는 녹아웃 라이브 예제와 비슷합니다. 내 제품은 실제로 코드 종류 중 하나를 입력하고 자신의 장바구니에 제품의 전체 세부 정보를 얻을 수 있어야합니다 코드 종류. 그래서 각 종류의 코드에 대해 두 개의 입력을 가지게 될 것이고 사용자가 그 중 하나에 코드를 입력하면 ajax 호출을 작성하고 productId, productName, the_other_code 등의 제품 정보를로드해야합니다. 아약스 전화를하고, 서버에서 데이터를받은 후 모델의 데이터를 설정하지만 재귀 이벤트 (구독) 발사의 종류를 만들고, 따라서 반복 아약스 메소드를 호출 -

I'v은 모두 & CODE2를 코드 1에 가입하여이에 시도 .메서드 중에 knockout 가입을 OFF로 설정할 수 있으면 재귀 동작이 발생하지 않는다고 생각합니다.

function Product(data) 
{ 
    var self = this; 

    self.ProductId = ko.observable(); 
    self.Code1 = ko.observable(); 
    self.Code2 = ko.observable(); 
    self.Title = ko.observable(); 

    self.SetData = function (itemdata) { 
     self.ProductId (itemdata ? itemdata.ProductId : null); 
     self.Code1(itemdata ? itemdata.Code1 : null); 
     self.Code2(itemdata ? itemdata.Code2 : null); 
     self.Title(itemdata ? itemdata.Title : null); 
    }; 

    self.SetData(data); 

    self.Code1.subscribe(function (value) 
    { 
     var productInfo = Ajax_GetPartDataWithCode1(value); 
     self.SetData(productInfo); 
    }); 

    self.Code2.subscribe(function (value) { 
     var productInfo = Ajax_GetPartDataWithCode2(value); 
     self.SetData(productInfo); 
    }); 
} 

어떤 도움이 크게 도움이 될 것입니다!

+0

는 간단한 부울 플래그를 사용하여 시도 유무 : 다음 콜백 바로 플래그가 설정되어있는 경우 반환 가입에 종료 할 때 SetData 들어가면 false로 true로 설정? 'SetData'를 입력 할 때 true로 설정하고 종료 할 때 false로 설정하면 구독 콜백에서 즉시 플래그가 설정되면 – antishok

+0

으로 설정하면 답변이되어야한다고 생각합니다. 그게 내가 어떻게하는지, 비록 여기에 설명 된대로 당신이 그것을 추가 할 때 그것에 대한 참조를 저장하면 구독 처리기를 제거 할 수 있습니다 : http://stackoverflow.com/questions/10653030/how-to-unsubscribe-the-s subscribed -function-in-knockout –

+0

@antishok 대단히 감사합니다. 나는'ko'에 대한 해결책을 찾는 것에 너무 빠져서 더 간단한 해결책을 잊어 버렸습니다. 당신의 대답을 대답으로 바꾸십시오. – sos00

답변

2

간단한 부울 플래그로 충분합니다.

var updatingData = false; 

    self.SetData = function (itemdata) { 
     updatingData = true; 
     self.ProductId (itemdata ? itemdata.ProductId : null); 
     self.Code1(itemdata ? itemdata.Code1 : null); 
     self.Code2(itemdata ? itemdata.Code2 : null); 
     self.Title(itemdata ? itemdata.Title : null); 
     updatingData = false; 
    }; 

    self.SetData(data); 

    self.Code1.subscribe(function (value) 
    { 
     if (updatingData) return; 
     var productInfo = Ajax_GetPartDataWithCode1(value); 
     self.SetData(productInfo); 
    }); 

    self.Code2.subscribe(function (value) { 
     if (updatingData) return; 
     var productInfo = Ajax_GetPartDataWithCode2(value); 
     self.SetData(productInfo); 
    });