2011-09-17 3 views
1

다른 상태를 가진 항목 (전자 메일 수신자) 목록을 렌더링하는 데 Backbone.js를 사용하고 있습니다. 확정, 계류 중 등. 목록이 렌더링 된 후 사용자가 모든 수신자를 나열하거나 확인 된 수신자 만 나열 할 수 있도록 사용자가 필터링 할 수있는 옵션이 있습니다. 항목 (받는 사람) 자연Backbone.js : 모든보기를 지우는 가장 좋은 방법

내 접근 방식은 필터 이벤트에이다 .. 콜렉션에 저장됩니다

  1. 모두 지우기 항목의보기의 응용 프로그램보기 통화에서
  2. 컬렉션에서 filterOnStatus 기능 모든 모델을 반환하고 뷰에 추가합니다.

2 단계는 정상적으로 작동합니다. 컬렉션의 뷰에서 모든 항목을 지우는 가장 좋은 방법은 무엇입니까?

Todo 예제 응용 프로그램 (http://documentcloud.github.com/backbone/examples/todos/index.html)에서 비슷한 기능을 수행합니다. App 뷰에서 다음 코드를 사용하여 완성 된 모든 항목을 목록에서 지 웁니다.

차이점은 실제 모델을 제거하면됩니다. 그리고 그 모델의 뷰는 뷰를 제거하는 파괴 이벤트를 수신합니다.

모델을 유지하고 싶습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 모델에서 뷰에 대한 참조를 저장 한 다음 모델을 반복하고 뷰를 제거해야합니까?

모델의 속성을 필터링하려면 더 나은 방법이 있습니까?

답변

0

첫 번째 단계는 단순히 왜 당신이 좋아, 그냥 할 것이다 앱 조회에 대한 간단한 방법을 추가하지 모든 항목을 삭제하는 경우 : clearList: function() { this.$('.list').html('') }합니다.

또는 더 나은 방법으로 모든 모델을 필터링하여 임시 요소로 렌더링하고 현재 목록을 대체 할 수 있습니다. 따라서 모든 필터링은 하나의 DOM 호출에서만 수행됩니다 (DOM은 느림). jQuery의 예 :

AppView.filterOnStatus = function() { 
    var $fragment = $('<div/>') 

    // filter your collection and append rendered views to $fragment 

    this.$('.list').html($fragment.html()) 
} 

물론 복잡한 방법이 있지만 필요로하는 것은 달성하려는 대상에 따라 다릅니다. 내가 이해 한 바로는이 간단한 접근법으로 충분할 것입니다.

+1

그러나이 방법을 사용하면 내보기가 느슨합니다 (모든 목록 항목은보기입니다). 아니? – Sebastian

+0

트랙을 잃어 버리면 정확히 무엇을 의미합니까? 왜 그걸 갖고 싶니? –

+0

나는 뷰 객체, 메모리 와이즈를 의미했습니다. view.remove()를 호출하지 않습니다. 그 위에. 하지만 DOM에서 DOM 표현을 제거하면 백본보기가 자동으로 제거된다는 말입니까? – Sebastian