2012-11-28 90 views
1

我創建了一個窗口,像這樣:遷移從煎茶ExtJS的4.0到4.1的ExtJS

_target = new Ext.Window({ 
    layer: 'top', 
    width: _width, 
    height: _height, 
    constrainTo: aBody, 
    constrain: true, 
    renderTo: aBody, 
    autoScroll: true, 
    flex: 1, 
    modal: (targetParams.Modal != undefined) ? targetParams.Modal : false, 
    resizable: (targetParams.Resizable != undefined) ? targetParams.Resizable : true, 
    minimizable: (targetParams.Minimizable != undefined) ? targetParams.Minimizable : true, 
    maximizable: (targetParams.Maximizable != undefined) ? targetParams.Maximizable : true, 
    closable: (targetParams.Closable != undefined) ? targetParams.Closable : true, 
    maximized: _maximized, 
    minimzed: _minimized, 
    isInFront: true 
});  

,然後做到這一點:

_target.on("render", function (items) { 
    if (items.length > 0) { 
     this.show(); 
     this.add(items); 
     this.doLayout(); 
     var buttonText = targetParams.ButtonText || this.title; 
     createToolbarButton(this.id, buttonText, targetParams.UIConfigurationId); 
    } else { 
     _target.destroy(); 
    } 
}); 

的問題是在這條線this.show();。在4.0這一行調用這個函數

show: function() {   
    this.callParent(arguments); 
    this.performDeferredLayouts(); 
    return this; 
}, 

但在4.1在同一行調用另一個函數:

show: function(animateTarget, cb, scope) {   
    var me = this; 

    if (me.rendered && me.isVisible()) { 
     if (me.toFrontOnShow && me.floating) { 
      me.toFront(); 
     } 
    } else if (me.fireEvent('beforeshow', me) !== false) { 
     me.hidden = false; 

     if (!me.rendered && (me.autoRender || me.floating)) { 
      me.doAutoRender(); 
     } 
     if (me.rendered) { 
      me.beforeShow(); 
      me.onShow.apply(me, arguments); 

      if (me.ownerCt && !me.floating && !(me.ownerCt.suspendLayout || me.ownerCt.layout.layoutBusy)) { 
       me.ownerCt.doLayout(); 
      } 
      me.afterShow.apply(me, arguments); 
     } 
    } 
    return me; 
}, 

在其上下行試圖做layout.renderChildren(),然後給出了一個錯誤。

我認爲很明顯創建的對象是不同的,但我沒有看到在「升級4.0到4.1」文檔中解決的這個問題。

所以我的問題是我必須做什麼使這項工作?

在此先感謝您的幫助。

UPDATE:

該應用程序結構添加窗口會是這個樣子後:

ViewPort 
North 
    ... 
West 
    ... 
Center 
    Window 
     Panel 
      Panel 
       Label 
       ... 
      BorderSplitter 
      Panel 
       Label 
       ... 
     Panel 
      List 
South 
    ... 

我做了一些修改代碼,它不會產生這個錯誤了。

_target.on("beforeRender", function (items) { 
    if (items.length > 0) { 
     _target.add(items); 
     _target.doLayout(); 
     var buttonText = targetParams.ButtonText || _target.title; 
     createToolbarButton(_target.id, buttonText, targetParams.UIConfigurationId); 
    } else { 
     _target.destroy(); 
    } 
}); 
_target.show(); 
_target.toFront(); 

但是現在當我撥打_target.add(items);時,它會產生另一個。

的錯誤是「無法獲得的特性‘DOM’價值」這條線

me.container = container.dom ? container : Ext.get(container); 

我試圖分析調用堆棧,發現它爲什麼給這個錯誤。當調用此函數:

renderChildren: function() { 
    var me = this, 
     items = me.getLayoutItems(), 
     target = me.getRenderTarget(); 

    me.renderItems(items, target); 
}, 

其中「這」指的是窗口的佈局對象,到了那裏我加入的項目,呼叫「getRenderTarget()」返回undefined。然後嘗試訪問未定義的dom屬性,拋出上面提到的錯誤。

這就是我迷失的地方,因爲如你所見,當我創建窗口時,我將一個對象(aBody)傳遞給renderTo屬性。

任何想法??

+0

你能分享確切的錯誤嗎? 另外,爲什麼你在「渲染」中調用this.show()? –

+0

錯誤是「對象不支持此屬性或方法'renderChildren()'」。我在渲染器中調用它只顯示窗口,以防在其中渲染任何項目。 –

+0

使用此事件(beforeshow):http://docs.sencha.com/ext-js/4-1/#!/api/Ext.AbstractComponent-event-beforeshow 如果您不想要,請在事件中返回false顯示窗口。 –

回答

0

它必須與佈局。佈局'合適'似乎工作。