我创建了一个小提琴,只是为了模拟我的问题,即类属性在窗口销毁时没有被重置。
如何测试:打开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);
},
3条答案
按热度按时间sulc1iza1#
当您定义
TestWindow
定义类获取空数组属性(非基元数据类型)。当您通过var win = Ext.create('TestWindow')
创建一个示例时,该示例将获取该属性。但是,当您设置以下内容时:将空数组设置为示例
win
的属性_panels
,而不是定义类TestWindow
上的属性_panels
;TestWindow
会保留现有的变异_panel
,下次创建新示例时,它会从类定义中获取相同的_panel
。我知道你这样做是为了展示问题。但是,我更喜欢让框架做所有繁重的工作(创建和销毁等):
t30tvxxf2#
简单的答案就是原型继承(参见this MDN文章)。基本上,您的非原语将被带到新示例中,因为它们存在于原型类中,并且因为它们是非原语,所以使用的是相同的引用。为了解决这个问题,我建议将您的
_panels
变量 Package 在config块中,如下所示:并鼓励您使用适当的set/get方法,而不是直接访问它:ru9i0ody3#
如果上一个答案中的原型行为是“一个特性/故意的坏代码/具有意外后果的遗留代码”,则A * 低于正确答案 *
在面板示例化后,手动覆盖原型值