2014-01-17 4 views
1

v2.0에서 위젯을 올바르게 처분하는 방법은 무엇입니까? 내가 읽은 것으로부터 이것은 DOM에서 제거 될 때 자동으로 수행되지만, jQuery.remove()가 canDeactivate() 또는 deactivate()가 호출되지 않는다는 것을 사용하여 DOM에서 내 위젯을 제거한다고 가정합니다. 비활성화 콜백 호출을 위해 DOM에서 제거해야하는 특정 방법이 있습니까?Durandal 2.0 위젯 처리

답변

1

예, 실제로 있습니다. 문서화가 잘되어 있지 않아서 놓치기 쉽습니다.

녹아웃에는 유틸리티 기능 ko.utils.domNodeDisposal.addDisposeCallback(element, callback)이 있습니다. 이 함수는 요소가 삭제 될 때 콜백이 호출되도록합니다. 그러나 '처분'은이 경우 매우 구체적입니다. jQuery.remove()은 트리거하지 않습니다. 노드를 처분하는 방법은 ko.removeNode(element)을 사용하는 것인데, 이는 DOM 요소 (및 해당 하위 요소)를 제거 할뿐만 아니라 바운드 이벤트 핸들러 등에서 몇 가지 추가 정리를 수행합니다. (미안하지만, 세부 사항이 약간 불투명합니다. 자세한 내용이 필요하면 Knockout의 구현을 항상 확인할 수 있습니다.)

내부적으로보기를 처리 할 때 Durandal은 ko.removeNode을 사용합니다. 따라서보기가 제거되면 모든 요소가 제거되고 앞에서 설명한 유틸리티 함수를 사용하여 설정된 disposeCallbacks가 호출됩니다. Durandal이이 프로세스에 콜백을 트리거하여 비활성화하는 것이 확실합니다.

TL : DR : jQuery.remove(element) 대신 ko.removeNode(element)을 시도하십시오. 그러면 비활성화 콜백이 트리거됩니다.

+0

모든 사항에 대한 knockout의 설명서를 찾았습니다.하지만 바인딩에 대한 자세한 내용은 밝혀야합니다. ko.removeNode를 검색해도 공식 문서에 검색 결과가 제공되지 않습니다. 어쨌든 대답에 감사드립니다. 롭 아이젠 버그 (Rob Eisenberg)는 Durandals Google Group에 대한 내 게시물에 동일한 답글을 썼습니다. ko.removeNode (element)를 사용하면 실제로 원하는 동작을 제공합니다. –