简体   繁体   English

Extjs:销毁并重新打开模态窗口

[英]Extjs : destroy and reopen modal window

I have on my page header a preference link which open a modal window (it's for modifying user preferences like name or password). 我的页面标题上有一个首选项链接,该链接打开一个模式窗口(用于修改用户首选项,如名称或密码)。

On cancel button I close this window, but when I tried to reopened it I have this JS error : 在“取消”按钮上,我关闭了此窗口,但是当我尝试重新打开它时,出现了JS错误:

el.addCls.apply(el, arguments);

Is I use the good way to close this window or is the problem is elsewhere ? 我是使用关闭此窗口的好方法还是问题出在其他地方?

Here is my code : 这是我的代码:

// My window definition
Ext.define('jnotes.window.UserPreferences', {
    extend: 'Ext.window.Window',
    layout: 'fit',
    modal: true,
    renderTo: Ext.getBody(),
    title: "<s:text name='user.preferences' />",
    items: new Ext.form.Panel({
        bodyPadding: 5,
        waitMsgTarget: true,
        method: 'POST',

        fieldDefaults: {
            labelAlign: 'right',
            labelWidth: 85,
            msgTarget: 'side'
        },
        defaultType: 'textfield',
        items: [{
            ... // my fields
        }],
        buttons: [{
            text: "<s:text name='action.save'/>",
            handler: function() {
                this.up('form').fireEvent('validate');
            },
        }, {
            text: "<s:text name='action.cancel'/>",
            handler: function() {
                this.up('form').fireEvent('cancel');
            }
        }]
    })
});

var preferencesWindow = null;

// Open my window
function displayPreferences() {
    preferencesWindow = Ext.create('jnotes.window.UserPreferences');
    var form = preferencesWindow.down('form');
    form.addListener('validate', this.saveUser, this);
    form.addListener('cancel', function() {
        preferencesWindow.close();
        preferencesWindow = null;
    }, this);
    form.load({
        ... // Loading data
    });
    preferencesWindow.show();
};

The way you've defined your class, the form is created and shared across all instances of the class. 定义类的方式将创建该表单,并在该类的所有实例之间共享表单。 When you destroy the window the first time, the form gets destroyed along with it and that's the end of it. 第一次销毁窗口时,表单会随之销毁,这就是结束了。

Instead, you should either: a) Specify a form configuration object: 相反,您应该:a)指定一个表单配置对象:

items: {
    xtype: 'form',
    // ....
}

b) Specify the form in the initComponent method so it's bound to that instance: b)在initComponent方法中指定表单,以便将其绑定到该实例:

Ext.define('MyFoo', {
    initComponent: function(){
        this.items = new Ext.form.Panel(...);
        this.callParent();
    }
});

Another solution that might fix your problem is to specify the closeAction in the window configuration: 可能解决您问题的另一种解决方案是在窗口配置中指定closeAction:

closeAction: 'hide'

More from Extjs Docs about closeAction: 来自Extjs Docs的有关closeAction的更多信息:

The action to take when the close header tool is clicked: 单击关闭标题工具时要执行的操作:

Possible values: 可能的值:

 'destroy' : remove the window from the DOM and destroy it and all descendant Components. The window will not be available to be redisplayed via the show method. 
'hide' : hide the window by setting visibility to hidden and applying negative offsets. The window will be available to be redisplayed via the show method.

By default the close action value is destroy. 默认情况下,关闭操作值是destroy。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM