2011-05-05 4 views
3

Я пишу приложение BackboneJS, где каждая из шести вкладок представлена ​​их собственными представлениями. Я должен сохранить экземпляр представления и просто назвать его функцией render() всякий раз, когда пользователь нажимает вкладку, к которой он уже был? Или создать новый экземпляр и получить доступ к шаблону, который jQuery кэшировал для меня во время первого рендеринга?BackboneJS - примеры кеширования

Если я сделаю последнее, мне все равно нужно убедиться, что другая коллекция не была получена через мой JSON API, поскольку это было сделано во время инициализации некоторых представлений.

В настоящее время я храню все экземпляры представления в контроллере, но мне было интересно, если это было встроено, или есть лучшие альтернативы.

Cheers.

Update: Вот моя loadCachedView функция, которую я использую в моем контроллере:

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).

ответ

3

Обычно я отслеживаю все свои взгляды в своем контроллере. Контроллер затем переключаться между доступными видами на основе навигационных событий:

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"); 
     } 
    } 
}); 

Это вид с точки зрения основания для переключения между одним видом и другим. Контроллер создаст представление (извлечение данных по мере необходимости), и когда вы переключитесь, вы можете выполнить свои последние проверки в функции overriden show() в представлении.

(обратите внимание, что я использую отсоединение на jQuery, чтобы продолжить работу делегирования события)

+0

Мне нужно было изменить this.el.detach() на $ (this.el) .detach() для кода работать. В противном случае у меня было подобное требование, и это лучшее решение, с которым я столкнулся. –

+0

Итак, это значит, что вы делаете то же, что и я, с loadCachedView или аналогичным (сохраняя экземпляр представления и просто называя его функцией show())? –

+0

Я думаю, да. Но он удаляется из дома, а не скрывается. – Julien

1

Не могли бы вы использовать функцию .memoize здесь?

+0

Скажите, что? Который из? –

+0

@Jonatan '_.memoize' - это встроенная функция кеширования с подчеркиванием. – Raynos

+0

Ах, я только посмотрел в документах Backbone. Плюс я думал, что он ошибся «запомнить» :-) –

Смежные вопросы