Ext JS HashMap窗口关闭后未销毁,如何创建新实例清除旧值?
解决Ext JS窗口关闭后HashMap未销毁的问题
这个坑我之前踩过!Ext JS里的HashMap要是没处理好作用域,窗口关了再开还带着旧数据,确实头疼。本质原因就是你的HashMap实例没有和窗口组件的生命周期绑定,窗口销毁了它还被引用着,下次渲染自然就复用旧值了。
下面给你几个实用的解决思路,亲测有效:
核心方案:把HashMap和窗口生命周期绑定
1. 在窗口初始化时创建全新的HashMap实例
别把HashMap定义在类的外部或者原型属性里,而是放到窗口的initComponent方法里,这样每次窗口被创建都会生成新的实例:
Ext.define('MyApp.view.MyWindow', { extend: 'Ext.window.Window', alias: 'widget.mywindow', initComponent: function() { // 重点:每次窗口初始化都新建HashMap this.myHashMap = new Ext.util.HashMap(); // 别忘了调用父类的初始化方法 this.callParent(arguments); }, // 你的其他窗口配置、方法... });
2. 监听窗口销毁事件,主动清理引用
虽然JS垃圾回收会处理,但主动清理能彻底避免残留引用的问题,更稳妥:
initComponent: function() { this.myHashMap = new Ext.util.HashMap(); // 监听窗口销毁事件,清理HashMap this.on('destroy', function() { // 先清空内容,再解除引用 this.myHashMap.clear(); this.myHashMap = null; }, this); this.callParent(arguments); }
3. 确认窗口的关闭行为配置
如果你是用close()方法关闭窗口,默认closeAction是destroy(销毁实例),但如果被改成了hide(只隐藏),那窗口实例根本没销毁,HashMap自然留着旧值。这时候可以监听hide事件来重置:
// 要是用了closeAction: 'hide',就加这个监听 this.on('hide', function() { // 要么清空,要么直接新建 this.myHashMap.clear(); // 或者 this.myHashMap = new Ext.util.HashMap(); }, this);
避坑提醒
- 千万别把HashMap定义成类的静态属性(比如用
statics块),静态属性是属于类本身的,所有窗口实例共享,肯定会串数据。 - 如果HashMap是窗口内部子组件在用,也要确保子组件里的HashMap是随窗口初始化创建的,别复用全局或者父级的旧实例。
这样处理后,每次窗口打开(或者隐藏后重新显示)都会拿到全新的HashMap,旧值就不会跟着跑啦!
内容的提问来源于stack exchange,提问作者jenkelblankel
相关产品推荐
相关产品推荐

