2012-06-06 116 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被調用。我想知道你是否可以爲我的場景提供任何指導。 我有一個包含側邊欄,頂欄和內容的容器視圖,所有這些視圖中的3個可以在1個狀態轉換中更改。 因此,當內容視圖currentViewBinding更改時,整個containerview不會被銷燬,因此willDestroy不會被調用。 我不想每次渲染容器視圖的子視圖,我只想隱藏並顯示它。這可能嗎? – dagda1

+0

我不認爲這仍然有效。雖然第一個視圖在內存中仍然存在,但在切換視圖後,其狀態爲「銷燬」,其isDestroyed屬性爲true,因此不會顯示。 –

1

你可以擴展Ember.ContainerView顯示/隱藏其currentView視圖像這樣:當整個containerview被破壞

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