EXTJS 6.7 -销毁时未清除类属性

fgw7neuy  于 2022-11-05  发布在  其他
关注(0)|答案(3)|浏览(200)

我创建了一个小提琴,只是为了模拟我的问题,即类属性在窗口销毁时没有被重置。
如何测试:打开fiddle,按OPEN按钮,添加3个面板,关闭ext窗口,再次按OPEN按钮,添加更多面板。
面板编号表示window中_panels数组属性的长度。
现在地问题。
如您所见,面板编号在添加新面板时未重置。因此,如果您添加3个面板并关闭窗口,重新打开窗口时面板计数显示3,然后4,然后5而不是0 1 2 ...
我的问题是,为什么?
小提琴示例
谨致问候
阿曼多

EDIT:以便查看解决方案

我结束了对我的应用程序的修改,把属性移到了构造函数中。

constructor: function() {
    Ext.apply(this, {     
        width: 800,      
        height: 600, 
        layout: 'vbox', 
        _panels : []
    }); 
    this.callParent(arguments); 
},
sulc1iza

sulc1iza1#

当您定义

Ext.define('TestWindow', {
    extend: 'Ext.window.Window',
    _panel: []
});

TestWindow定义类获取空数组属性(非基元数据类型)。当您通过var win = Ext.create('TestWindow')创建一个示例时,该示例将获取该属性。但是,当您设置以下内容时:

onDestroy: function() {
      this._panels = [];
    },

将空数组设置为示例win的属性_panels,而不是定义类TestWindow上的属性_panels; TestWindow会保留现有的变异_panel,下次创建新示例时,它会从类定义中获取相同的_panel
我知道你这样做是为了展示问题。但是,我更喜欢让框架做所有繁重的工作(创建和销毁等):

Ext.define('TestWindow', {
    extend: 'Ext.window.Window',

    width: 800,
    height: 600,

    defaultListenerScope: true,
    layout: 'vbox',

    initComponent: function() {
        this._panels = [];
        this.callParent(arguments);
    },

    addPanel: function() {
        console.log(this._panels.length);

        var panels = this._panels;
        panels.push(this.add({
            xtype: 'panel',
            title: 'Panel ' + panels.length,
            height: 50,
            width: '100%'
        }));
    },

    tbar: [{
        xtype : 'button',
        text: 'add',
        handler: 'addPanel'
    }]

});
t30tvxxf

t30tvxxf2#

简单的答案就是原型继承(参见this MDN文章)。基本上,您的非原语将被带到新示例中,因为它们存在于原型类中,并且因为它们是非原语,所以使用的是相同的引用。为了解决这个问题,我建议将您的_panels变量 Package 在config块中,如下所示:并鼓励您使用适当的set/get方法,而不是直接访问它:

config: {
    _panels : []
}
ru9i0ody

ru9i0ody3#

如果上一个答案中的原型行为是“一个特性/故意的坏代码/具有意外后果的遗留代码”,则A * 低于正确答案 *
在面板示例化后,手动覆盖原型值

相关问题