2012-06-06 2 views
1

У меня есть Statemachine и я использую новую currentViewBinding выгрузить части общей containerView всякий раз, когда новое состояние вводится с помощью currentViewBinding:ember.js - currentViewBinding и остановки повторного рендеринга на каждый вид перехода

index: Ember.State.create({ 
    enter: function(manager) { 
     App.get('appController').set('feedView', Ember.View.create({ 
     templateName: 'dashboard_feed', 
     contentBinding: 'App.feedController.content', 
     controller: App.get('App.feedController') 
     })); 
    } 
    }) 

В настоящий момент рендеринг этих представлений довольно медленный. Есть ли способ сохранить представление в памяти и избежать повторного рендеринга каждый раз, когда я вхожу в состояние?

ответ

3

Я действительно предоставил решение этого для другого вопроса о StackOverflow, но это тоже очень актуально. Avoiding re-rendering of a flash object from scratch when view is reactivated

Вот jsFiddle: http://jsfiddle.net/EE3B8/1

Выражаю ContainerView с флагом, чтобы остановить его от уничтожения CurrentView на его уничтожение. Вы захотите, чтобы где-то скрывали экземпляр представления, который он не будет уничтожен.

App.ImmortalContainerView = Ember.ContainerView.extend({ 
    destroyCurrentView: true, 

    willDestroy: function() { 
     if (!this.destroyCurrentView) { this._currentViewWillChange(); } 
     this._super(); 
    } 
}); 

App.immortalView = Ember.View.create({ 
    template: Ember.Handlebars.compile(
     'I WILL LIVE FOREVER!' 
    ) 
}); 

+0

willDestroy вызывается, когда вся containerview разрушается. Интересно, можете ли вы предложить какие-либо рекомендации по моему сценарию. У меня есть свод, содержащий боковую панель, верхнюю панель и контент, все 3 из которых могут меняться в 1 переход состояния. Таким образом, при изменении содержимого currentViewBinding весь файл keeperview не будет уничтожен, и поэтому методDestroy не будет вызван. Я не хочу каждый раз отображать дочерний вид содержимого содержимого, я просто хочу скрыть и показать его. Это возможно? – dagda1

+0

Я не верю, что это все еще работает. После переключения представлений, хотя первое представление все еще существует в памяти, его состояние «уничтожает», а его атрибут isDestroyed является истинным, и, следовательно, он не появляется. –

1

Вы можете расширить Ember.ContainerView, чтобы показать/скрыть свое мнение CurrentView так:

App.FastContainerView = Ember.ContainerView.extend({ 
    toggleCurrentViewFast: true, 

    _currentViewWillChange: function() { 
    var childViews = this.get("childViews"), 
     currentView = this.get("currentView"); 

    if (this.toggleCurrentViewFast && childViews.indexOf(currentView) >= 0) { 
     currentView.set("isVisible", false); 
    } else { 
     this._super(); 
    } 
    }, 

    _currentViewDidChange: function() { 
    var childViews = this.get("childViews"), 
     currentView = this.get("currentView"); 

    if (this.toggleCurrentViewFast && childViews.indexOf(currentView) >= 0) { 
     currentView.set("isVisible", true); 
    } else { 
     this._super(); 
    } 
    } 
}); 
Смежные вопросы