2012-07-31 2 views
3

우리는 백본을 몇 달 동안 사용해 왔지만, 숨겨진보기를 볼 수있는 모델과 공유 할 때 더 나은 방법이 있어야한다고 생각합니다. 예를 들어 "세그먼트보기"보기와 "세그먼트 편집"보기는 모두 "세그먼트"모델을 나타냅니다. 그 중 하나는 언제나 숨겨져 있지만 다른 이벤트와 동일한 이벤트 (Ajax 호출 포함)를 계속 듣고 있습니다. 왜 우리가 뷰를 대체하는지 숨기는 이유에 대한 이유는 뷰가 많은 양의 데이터와 DOM 요소를 표시하기 때문에 뷰를 변경하는 동안로드 시간을 최소화하기를 원한다는 것입니다. 숨겨진 뷰가 표시 될 때까지 렌더링되지 않아도된다는 생각이 들었습니다.보이는 모델을 공유하는 숨겨진 백본보기를 관리합니다.

이 시나리오를 처리하는 적절한 방법이 있습니까? 이 문제를 어떻게 처리할까요? 전체보기에서 이벤트 수신을 일시적으로 사용하지 않도록 설정하는 간단한 방법이 있습니까?

+0

업데이트 : 모델 변경으로 인해 발생하는 이벤트 수신을 해제하고 싶었음을 분명히해야했습니다. – soultrust

답변

1

간단한 아이디어 : 나는 당신이 delegateEvents Backbone.Viewt 제공 할 수 있습니다 생각하고, 당신이 EditSegment 처음 사용 undelegateEvents 동적 취소 ViewSegment 이벤트, 다음 delegateEvents을 표시 할 때 undelegateEvents 방법은 동적으로 이벤트를 설정 동적 초기화 EditSegment 이벤트.

편집-20120801 : 모델이 변경됩니까을 렌더링 할 때 약 model.unbind

bindTo: function(model, ev, callback) { 
     model.bind(ev, callback, this); 
     this.bindings.push({ 
      model: model, 
      ev: ev, 
      callback: callback 
     }); 
    }, 

    _unbindFromAll: function() { 
     _.each(this.bindings, function(binding) { 
      binding.model.unbind(binding.ev, binding.callback); 
     }); 
     this.bindings = []; 
    }, 
+0

(un) delegateEvents는 뷰의 'events'객체에서 정의한 이벤트를 수신하는 이벤트 만 끄기 만합니다. 모델 변경 사항 수신을 해제하고 싶습니다. – soultrust

+0

@TomoSuzuki 안녕하세요, 내 업데이트를 참조하여 요구 사항을 적절하게 변경할 수 있습니다. –

3

내보기는 항상 모델의 변경 이벤트를 수신. 나는 당신을 위해 같은 것을 가정합니다. 그래서 Model이 가져 왔을 때 (당신이 의미하는 Ajax 호출), 당신은 아무것도 원하지 않습니다. 당신의에서 렌더링 (및 모델 변경에 대한 청취 방법) 보이는 경우 확인할 수 :보기의 주요 요소가 표시되는 경우 또한에만 작동 이벤트를 선언

render : function(){ 
    if(!this.$el.is(":visible")){ 
    //skipping any render action because our view is hidden 
    return this; 
    } 
} 

, 단지 선택에 추가 접두사 : 자녀 선택기 앞에 표시 :

"click :visible .button" : "buttonClickHandler" 
6

표시 및 수정보기에서 동일한 시나리오를 사용합니다. 우리는 모든 모델 바인딩 로직을 bindEvents 메소드로 수집하고 unbindEvents 메소드를 보완했습니다. 뷰의 hide -method에서

, 우리는 unbindEvents를 호출하고 show 방법 우리는 bindEvents를 호출합니다. 그처럼 간단합니다. 좀비보기를 피하기 위해 initialize 방법에서는 bindEvents, remove 방법에서는 unbindEvents이라고 부릅니다. 그들은 일반적으로 HTML의 무리 의지를 렌더링 피하기 위해, 그런데

숨겨진 뷰 해고하지 않는합니다 (아르 클릭의 대부분 또는 구동 변경)로 우리는 자바 스크립트 이벤트에 대한 상관 없어

절대 보이지 않을 때 처음보기까지 첫 번째 렌더링 렌더링을 연기하므로 show 메소드에서 우리는 this.isRendered (부울, 기본값은 false)을 테스트하고, 설정되지 않은 경우 뷰를 렌더링하기 전에 렌더링하고 설정합니다 사실로.