EXTJS 6.7 - class 属性在销毁时未清除

EXTJS 6.7 - class properties not cleared on destroy

我创建了一个 fiddle 只是为了模拟我的问题 class 属性 没有在 window 销毁时被重置。
如何测试: 打开 fiddle,按打开按钮,添加 3 个面板,关闭分机 window,再次按打开按钮,再添加一些面板。
面板编号表示 window.
中的 _panels 数组 属性 的长度 现在进入正题。
如您所见,添加新面板时的面板编号未重置。因此,如果您添加 3 个面板并关闭 window,重新打开 window 面板计数显示 3、4、5 而不是 0 1 2 ...
我的问题是,为什么?

Fiddle example

亲切的问候

阿曼多

编辑:所以可以看到解决方案
我结束了修复我的应用程序以像这样工作 fiddle。我将属性移至构造函数。

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

对此的简单回答是原型继承(参见 this MDN article). Basically your non-primitives will carry over to new instances because they exist on your prototype class, and because they're non-primitives, it's the same exact reference that's used. To fix this, I would recommend wrapping your _panels variable in the config 块,如下所示,并鼓励您使用适当的 set/get 方法,而不是直接访问它:

config: {
    _panels : []
}

一个 不正确的答案 如果上一个答案中的原型行为是“一个 feature/intentional 具有意外后果的错误代码/遗留代码”

在面板实例化后手动覆盖原型值

当你定义

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

TestWindow 定义 class 得到空数组 属性(no-primitive 数据类型)。当您通过 var win = Ext.create('TestWindow') 创建实例时,该实例将获得 属性。但是,当您设置:

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

它将空数组设置为实例 win 的 属性 _panels,而不是定义 class TestWindowTestWindow 保留现有的变异 _panel。下次您创建新实例时,它会从 class 定义中获得相同的 _panel

我知道你这样做是为了演示目的,以显示问题。但是,我更喜欢让框架完成所有 heavy-lifting(创建和销毁等):

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'
    }]

});