2011-05-05 2 views
3

6 개의 탭 각각이 고유보기로 표시되는 BackboneJS 앱을 작성하고 있습니다. 뷰의 인스턴스를 저장하고 사용자가 이미 방문한 탭을 클릭 할 때마다 render()이라는 함수를 호출해야합니까? 또는 새 인스턴스를 만들고 jQuery가 처음 렌더링 할 때 캐시 한 템플릿에 액세스 할 수 있습니까?BackboneJS - 캐싱보기 인스턴스

후자를 수행하는 경우 일부보기를 초기화하는 동안 다른 컬렉션이 내 JSON API를 통해 가져 오지 않도록해야합니다.

지금 내 컨트롤러에 모든보기 인스턴스를 저장하지만 이것이 내장되어 있는지 궁금 해서요 또는 더 나은 대안이 있습니다.

건배.

업데이트 : 뷰를 렌더링 할 때

loadCachedView: function (name, view, collection){ 
    if (!this.views[name]){ 
     if (collection){ 
      this.collections[name] = new collection(); 
     } 
     this.views[name] = new view({collection: this.collections[name]}); 
    } else { 
     this.views[name].render(); 
    } 
}, 

그래서, 난 그냥 이동 : this.loadCachedView('settings', SettingsView, SettingsCollcetion) 여기에 내가 내 컨트롤러에서 사용하는 내 loadCachedView 기능입니다.

답변

3

나는 보통 내 컨트롤러에서 모든 내 전망을 추적합니다. 그런 다음 컨트롤러는 nav 이벤트를 기반으로 사용 가능한보기간에 전환합니다.

var Switches; 
Switches = []; 
Skepic.SwitchView = Backbone.View.extend({ 
    hide: function() { 
     return this.el.detach(); 
    }, 
    show: function() { 
     if (!_.include(Switches, this)) { 
      Switches.push(this); 
     } 
     _.each(Switches, function(s) { 
      return s.hide(); 
     }); 
     this.container().append(this.el); 
     return $('html, body').animate({ 
      scrollTop: 0 
     }, 'fast', "linear"); 
    }, 
    container: function() { 
     if (this.options.container) { 
      return this.options.container; 
     } else { 
      return $("body > .content"); 
     } 
    } 
}); 

이는 하나의보기와 다른보기 사이를 전환하는 기본보기입니다. 컨트롤러는 뷰 (필요에 따라 데이터 가져 오기)를 만들고 스위치를 전환하면 뷰의 재정의 된 show() 함수에서 마지막으로 검사를 수행 할 수 있습니다.

+0

코드를 this.el.detach()를 $ (this.el) .detach()로 변경해야했습니다. 일하다. 그렇지 않으면 비슷한 요구 사항이 있었고 이것이 내가 만난 최고의 솔루션입니다. –

+0

그렇다면 loadCachedView 또는 이와 유사한 (뷰의 인스턴스를 저장하고 show() 함수를 호출하는 것) 동일한 작업을 수행한다는 의미입니까? –

+0

나는 그렇다고 생각한다. 하지만 숨겨진 DOM에서 제거됩니다. – Julien

1

여기에 .memoize 기능을 사용할 수 없습니까?

+0

무슨 말을 (난 아직도 작업 이벤트 위임을 위해 jQuery를에 분리 사용주의)? 어느 것? –

+0

@Jonatan'_.memoize'는 밑줄이있는 캐싱 함수를 작성합니다. – Raynos

+0

아, Backbone의 문서 만 보았습니다. 게다가 나는 그가 '기억할 것'이라고 잘못 생각했다. :-) –

관련 문제