在使用Extjs 开发时,可以用一静态类,将某些实例控件缓存下来:
一个静态类(公有帮助类),通过继承ViewCache类 ,来缓存实例
Ext.define('TD.util.Helper', {
alternateClassName: 'TDHelper',//自定义静态类名
mixins: ['ViewCache'], // 管理/缓存 界面实例
singleton: true,
/**
* 获取页面
* @param {*} key
* @param {*} xtypeName
*/
getView(key, xtypeName) {
const me = this;
let view = me.getFromViewCache(key);//通过一个key 值缓存独特实例
if (!view) {
view = Ext.create({
xtype: xtypeName
});
me.addToViewCache(key, view);//加到实例中
}
return view;
},
});
一个实例控件:
Ext.define('TD.view.DemoWin', {
extend: 'Ext.Dialog',
xtype:'td_demowin',
referenceHolder: true,
closable: true,
closeAction: 'destroy',//关闭即销毁
hidden: true,
maxWidth: '100%',
maxHeight: '100%',
width:600,
height:400,
defaultListenerScope: true,//作用域限定在界面内,省去 viewController
destroy(){
const me = this;
//复写destroy方法
Ext.getApplication().fireEvent('quanju');//例如在销毁时 发出一个全局事件
}
});
通过静态类缓存
let demowin = TDHelper.getView('tdDemoWin','td_demowin');//创建一个实例
demowin.show();// 让实例出现
其中 viewcache 可通过一个key值 来找到相应的实例控件,就是调用getFromViewCache(自定义key名)方法
而添加到缓存中,使用的是addToViewCache(自定义key名,控件实例)
自定义的key名 类似于 控件的一个id
统一清除实例控件,防止泄露
TDHelper.destroyAllViewCache()
如若在使用过程 遇到下面这种 session报错:

是因为部分viewcache里的实例,应该被销毁,但是没销毁,造成实例的方法还在执行,但是部分东西找不到了。
大多数是因为 复写了实例控件的 destroy方法,就像开头那个控件一样

解决办法:
复写的destroy方法里,加上 me.callParent(arguments)
destroy() {
const me = this;
me.callParent(arguments);//*****重要****
//复写的逻辑代码
}
本文介绍了在ExtJS开发中如何利用静态类进行视图缓存,以提高性能并避免内存泄漏。通过继承ViewCache类创建公共帮助类,使用自定义key存储和检索控件实例。同时讨论了遇到的session错误问题,原因是未正确销毁缓存的实例,解决方案是在自定义的destroy方法中调用me.callParent(arguments)确保销毁流程完整。

8251

被折叠的 条评论
为什么被折叠?



