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 に答える