2013-01-15 2 views
4

현재 내 앱을 구현하기 위해 백본을 사용하고 있습니다. 내가보기백본 켜기/끄기 (teardown)와 listenTo/stopListening의 차이점 구현

teardown: -> 
    for viewName, view of @subViews 
    view.teardown() 
    for object, events of @objectEvents 
    @_handleObjectEvents("off", object, events) 

    @off() 
    @remove() 
    @undelegateEvents() 
    @ 

메모리 대부분의 문제가 해결되는 것을 보장하기에 충분한이 방법인가를 전환하고 때 메모리 관리의 일환으로, 나는 모든 뷰의 분해를 유발한다? 여기서 볼 수있는 도전 과제는 각 뷰의 모든 하위 뷰를 추적하고 모든 주요 뷰와 하위 뷰에 대한 분해가 콜렉션의 일부로 호출되어야한다는 것입니다.

일부 검색을 수행 한 결과, 백본에는보기 레벨에서 이벤트 바인딩을 제어하는 ​​'listenTo'및 'stopListening'이라는 두 가지 이벤트가 있음을 발견했습니다.

view.listenTo(model, 'change', view.render); 
view.stopListening(model); 

제 질문은 겹쳐져 있고 티퍼 다운 구현과 'stopListening'을 사용하고 있습니까? 메모리 관리를 위해서만 'stopListening'을 사용할 수 있습니까?

+0

@DerickBailey을 이해하면 그 백본 메모리 관리 =에 대한 주제 전문가입니다. 따라서 여기에서 나를 도울 수 있기를 바랍니다. 미리 감사드립니다! – Zhen

답변

3

listenTo 메소드를 사용하는 것이 좋습니다. 그것의 niceness는 view에서 remove 메소드를 사용할 때 듣고있는 내용에 대해 자동으로 바인딩 해제 (stopListening 호출)한다는 것입니다. Derrick Bailey에 따르면, 이벤트 속성 아래의 이벤트도 바인딩 해제됩니다.

내 응용 프로그램을 0.9.2에서 0.9.9로 업그레이드하는 과정에 있기 때문에 (실제로는 여전히 작동 함) listenTo 및 stopListening으로 모든 on/off를 전환합니다. . 나는 또한 대부분 거기에 가까운 방법을 가지고있다. 그러나, 나는 아직도 undelegateEvents를 호출 할 것이다. 당신이 아직도 듣고있는 사건을 제거하고 있다는 것을 아는 것을 상처주지 않습니다.

4

짧은 대답은 예입니다. 중복이 있습니다.

더 복잡한 대답은 Backbone 0.9.9에서 도입 된 listenTo/stopListening 메서드가 이미 on/off 메서드를 사용하지만 유용한 추가 기능과 함께 _listeners라는 내부 개체에 현재 이벤트 수신기를 저장합니다.

이 개체를 사용하면 모든 청취자의 전체 목록을 항상 알 수 있습니다. 반복자를 사용하여 특정 요소를 제거 할 수 있습니다 (청취자는 단지 함수이고 함수는 단지 개체라는 것을 기억하십시오) .

그래서,이 방법으로 호출 할 수 있습니다 :이 방법을 사용하여, 그래서

this.stopListening(emitting_object, ["reset", "add"]) // Removes listeners for "reset" and "add" on emitting_object 
this.stopListening(emitting_object) // Removes all listeners on emitting_object 
this.stopListening() // Iterates over _listeners object and removes all listeners (probably the most usable case) 

, 당신이 이런 식으로 분해 방법을 변환 할 수 있습니다

this.teardown = function(){ 
    this.stopListening(); 
    ... 
} 
+0

왜 Backbone API가 Events.stopListening (obj, name, callback)에 대한 세 번째 매개 변수로 콜백을 사용하는지 이해하지 못 하겠지만, 누구도 알고 있나요? 콜백은 언제 해고 되나요? –

+0

'stopListening'는 콜백을 호출하지 않지만 호출자가 특정 객체 및 이벤트 유형 튜플에 대한 모든 핸들러를 제거하는 대신 'listenTo'에 대한 이전 호출에서 전달 된 특정 핸들러를 대상으로 지정할 수 있습니다. – Spig