2011-10-04 5 views
0

그것을 신호하지 않고 기능을 구독 난 할 노력하고있어 다음과 같다 :observableArray에서 요소를 제거합니다 이내에 다시

var queueManagerClass = function() { 

    this.queue = ko.observableArray(); 

    this.queue.subscribe(function(theChangedQueue) { 
     // Do some nice things.. 

     // Nice things are over, remove the last item from the queue.. 
     this.queue.remove(theChangedQueue.pop()); 

    }.bind(this)); 
}; 

2를 제외하고 문제가 발생 : 나는 this.queue.remove (항목)를 호출 할 때; 나는 무한 루프에 빠지게 될 것이다 .. 구독 함수는 스스로 그것을 반복해서 호출 할 것이다 ..

나는 구독 함수를 일시적으로 '바인딩 해제'하는 옵션이 있지만 사실은 위험 할 수 없다는 것을 알고있다. 바인딩을 해제하고 다시 바인딩하는 시간에 삽입 된 queueItem을 놓친다.

영어로만 이해할 수 있기를 바랍니다.

시간 내 주셔서 감사합니다.

답변

2

이 문제를 해결하는 한 가지 방법은 항목을 제거하는 과정에 있음을 감지하고 해당 이벤트가 발생하면 특별히 이벤트를 무시하는 것입니다. 이것은 "isRemoving"상태를 저장하기 위해 로컬을 사용하여 수행 할 수 있습니다. 예 :

var isRemoving = false; 
this.queue.subscribe(function(theChangedQueue) { 
    if (isRemoving) { 
    return; 
    } 

    // Do some nice things.. 

    // Nice things are over, remove the last item from the queue.. 
    isRemoving = true; 
    this.queue.remove(theChangedQueue.pop()); 
    isRemoving = false; 
}.bind(this)); 
+0

답장을 보내 주셔서 감사합니다. 그러나 한 가지 더 : 귀하의 솔루션에서 subscribe 함수는 이미 요소가 배열에서 제거되었을 때 단순히 반환하는 것입니다. 이 방법으로, subscribe 함수 외부에서 호출 된 subscribeEvents를 놓칠 수 있습니다. 맞습니까? 이 문제에 대한 해결책이 있습니까? – NickGreen

+0

@NickGreen 예 구독 기능에서 두 개의 구독자가있어 여기에서 이벤트를 놓칠 수있는 경우 – JaredPar

+0

hmmm이 경우 다른 해결책이 없을 수 있습니다. – NickGreen

관련 문제