2

我创建一个这样的窗口:

_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”文档中看到这个问题。

所以我的问题是我必须做些什么才能完成这项工作?

在此先感谢您的帮助。

更新:

添加窗口后的应用程序结构如下所示:

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

其中“this”指的是窗口的布局对象,在我添加项目的位置,调用“getRenderTarget()”返回未定义。然后尝试访问undefined的dom属性,抛出我上面提到的错误。

这就是我迷路的地方,因为如您所见,当我创建窗口时,我将一个对象(aBody)传递给 renderTo 属性。

有任何想法吗??

4

1 回答 1

0

它与布局有关。随着布局“适合”它似乎工作。

于 2012-12-11T13:26:37.297 回答