2012-12-13 140 views
0

我將一個大型應用程序從v2升級到v3.4Ext JS 3.4懶惰渲染手風琴 - 強制渲染面板

我有一個n> 1面板的手風琴。默認情況下,第一個擴展,其他所有不是。與現在使用Ext 3.4的Ext JS 2相反,面板只有在首先展開後纔會呈現。這會導致多個問題,因爲一些代碼路徑要求元素已經在DOM中。

deferredRender對手風琴沒有任何影響,它只是用於製表符。

我的嘗試:遍歷所有項目,並呼籲setActiveItemsetActive但這只是導致實際呈現的最後一個面板,所有其他的都還沒有的DOM裏面(我想激活元素是異步,即使animatefalse)。

我怎麼能告訴手風琴渲染所有的面板,即使它們最初都是崩潰的?

回答

1

AFAIK與accordion佈局面板中的所有組件立即呈現。示例:http://jsfiddle.net/P5Gen/3/

注意,子容器組件在容器上觸發afterrender事件後呈現。兒童的實際渲染是通過佈局來完成的,所以標記在afterlayout事件被觸發後可用。你可以撥打container.doLayout(false, true)

如果您需要使用摺疊佈局在每個容器上調用doLayout,則可以使用ComponentMgr來完成此操作。例如:

Ext.ComponentMgr.all.on('add', function(index, component){ 
    if (!(component instanceof Ext.Container)) { 
     return; 
    } 
    if (component.layout !== 'accordion' && !(component.layout instanceof Ext.layout.AccordionLayout)) { 
     return; 
    } 

    component.on('afterrender', function(sender) { 
     // do layout or something else 
     sender.doLayout(false, true); 
    }); 
}); 
+0

您的演示顯示了與我觀察不同的行爲,所以也許還有其他一些腳本與我的手風琴混淆了。我將無法在12月20日之前檢查,但我肯定會回答/投票。 – Prinzhorn

+0

那麼爲什麼你的小提琴中的面板會立即渲染到DOM而我的渲染不是?退房15.3。在http://www.sencha.com/forum/showthread.php?70352-Upgrading-to-Ext-3 – Prinzhorn

+0

我的例子顯示完全相反的行爲。看看源代碼。 AccordionLayout.onLayout調用ContainerLayout.renderAll方法,正如名稱所述,該方法呈現所有組件。我沒有看到任何延遲渲染相關的代碼,期望與'TabPanel'中使用的'CardLayout'有關。爲了避免這種情況,您可以將'Ext.TabPanel.prototype.deferredRender'設置爲'false'。如果你仍然面臨這個問題,試着重現例如jsfiddle,所以我可以看看它。 – Krzysztof