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。我将属性移至构造函数。
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 TestWindow
; TestWindow
保留现有的变异 _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'
}]
});
我创建了一个 fiddle 只是为了模拟我的问题 class 属性 没有在 window 销毁时被重置。
如何测试:
打开 fiddle,按打开按钮,添加 3 个面板,关闭分机 window,再次按打开按钮,再添加一些面板。
面板编号表示 window.
中的 _panels 数组 属性 的长度
现在进入正题。
如您所见,添加新面板时的面板编号未重置。因此,如果您添加 3 个面板并关闭 window,重新打开 window 面板计数显示 3、4、5 而不是 0 1 2 ...
我的问题是,为什么?
亲切的问候
阿曼多
编辑:所以可以看到解决方案
我结束了修复我的应用程序以像这样工作 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 TestWindow
; TestWindow
保留现有的变异 _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'
}]
});