2017-01-04 14 views
5

durandal 및 requirejs를 사용하여 내 viewmodels을 구성하고 있습니다. 나는 또한보기에서 멀리 이동할 때마다 컴포지션 수명주기 콜백 메서드 deactivate에 연결하려고합니다. 이 방법으로 내 viewmodel을 처리하고 싶습니다.비활성화 후 Durandal에서 뷰 모델을 처리하는 방법

delete this, this = undefined 시도했지만 작동하지 않는 것 같습니다.

나는 또한이 같은 durandal 이벤트 애그리 게이터 (aggregator)를 사용하고 있습니다 :

self.activate =() => { 
     App.trigger("testEvent"); 
    }; 

    App.on("testEvent").then(() => 
    { 
     alert('Event Triggered!'); 
    }); 

그래서 뷰 ​​모델이로드 될 때마다 이벤트가 트리거됩니다. 이제 뷰에서 멀리 탐색 한 다음 다시 탐색하면 (뷰 모델이 다시로드 됨) 이벤트가 두 번 트리거됩니다. 세 번째 시각에 대한보기로 이동하면 이벤트가 세 번 반복되는 식으로 진행됩니다. 따라서 이전 뷰 모델이 여전히 존재하므로 durandal 이벤트가 각 뷰 모델에 의해 트리거되는 이유입니다. 따라서이 문제를 해결하려면 뷰 모델을 비활성화해야합니다. 어떻게해야합니까?

참고. 문제의 뷰 모델은 싱글 톤이 아니라 일시적입니다.

답변

2

Durandal은 뷰가 DOM에 첨부 될 때만 트리거를 가져 오는 "첨부 된"수명주기 훅을 제공합니다. 이벤트 구독을 여기에 배치하면 한 번만 구독해야합니다.

http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks

편집 :

지금까지 당신이 구독에서 반환 값을 저장하는 경우, 당신은 당신의 비활성화에 나중에 .OFF 전화 또는 분리 방법

var subscription = App.on("testEvent"); 
... 
subscription.off(); 
수 있습니다 간다 이벤트에서 탈퇴로

http://durandaljs.com/documentation/Leveraging-Publish-Subscribe.html

viewmodel 자체는 관리되는 javascript 객체이므로 삭제됩니다. 그것에 대한 모든 참조가 사라지면 자동으로

+0

수신 거부가 트릭을 수행 한 것으로 보입니다. 내 이벤트가 더 이상 여러 번 호출되지 않습니다. 내 뷰 모델이 폐기되었는지 실제로 확인하는 방법이 있습니까, 아니면 신경 쓰지 않으시겠습니까? – Viqas

+0

수백 개의 뷰 모델을 인스턴스화하지 않으면 노력할 가치가 없지만 Chrome 개발자 도구를 사용하여 자바 스크립트 개체 수 및 메모리 할당을 모니터링하여 가비지 수집기가 개체를 성공적으로 정리하고 있는지 확인할 수 있습니다. –

1

'testEvent'이벤트에 가입하고 있지만 가입을 취소하지 않았기 때문에 아마 뷰 모델에 대한 참조가 유지됩니다. 나는 자바 스크립트에서 처분하는 방법에 전문가가 아니지만 .net의 비슷한 시나리오를 보았습니다.

이벤트가 세 번 트리거되지는 않지만 한 번 트리거되지만 이벤트 핸들러 함수는 per 3 회의 항해 후에 3 회 구독하십시오.

deactivate 메소드에서 탈퇴를 시도하고 작동하는지 확인하십시오. 적어도 이벤트 처리기를 세 번 실행하는 것을 중지합니다. 나는 이것이 당신의 뷰 모델을 올바르게 처리 할 지 확신하지 못한다.