精华帖 (0) :: 良好帖 (11) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-07
引用 http://www.extjs.com/forum/showthread.php?t=45782
该补丁包给几乎所有存在泄露的组件做了修正。 虽然补丁所描述的环境是ie,但实质上2.2在任何浏览器上都因为事件模型和组件本身销毁方法考虑不周的缘故使内存不断增长。 从2.0的组件树模型,到2.2对事件模型的修改,再到该补丁的出现,一页式的web应用真正走向成熟。呵呵。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-10-07
要注冊才能下載,能否提供一個直接下載的地址?
要是樓主能簡單翻譯就好了。 |
|
返回顶楼 | |
发表时间:2008-10-07
注册一下当是支持这么好的补丁,不急的话等官方的正式版吧
|
|
返回顶楼 | |
发表时间:2008-10-07
ext 组件中都包含类似 onDispose 等方法,个人认为用户在使用时应该实现或者重写这些方法,而不能要求框架来帮你做这些事情
比如你要销毁一个节点,不能简单地调用 Ext.Element.remove() 这个方法,你要清楚你在干什么,会发生什么后果,如果该节点的子结点中不存在泄露问题那直接remove当然好,单事实并非如此,而框架级的东西要帮你做这些事情,代码冗余,开销也大 |
|
返回顶楼 | |
发表时间:2008-10-07
规则应是,组件创建的,组件销毁。框架的组件也应该遵循规则。补丁正是按该规则进行修正。
看看两个例子 第一:GridView的修正,原来未正确的去掉监听事件,导致通过事件模型(EventManager.js的elHash)的泄漏: 引用 destroy : function(){
if(this.colMenu){ this.colMenu.destroy();//change by guig delete this.colMenu; } if(this.hmenu){ this.hmenu.destroy();//change by guig delete this.hmenu; } if(this.grid.enableColumnMove){ var dds = Ext.dd.DDM.ids['gridHeader' + this.grid.getGridEl().id]; if(dds){ for(var dd in dds){ if(!dds[dd].config.isTarget && dds[dd].dragElId){ var elid = dds[dd].dragElId; dds[dd].unreg(); Ext.get(elid).remove(); } else if(dds[dd].config.isTarget){ dds[dd].proxyTop.remove(); dds[dd].proxyBottom.remove(); dds[dd].unreg(); } if(Ext.dd.DDM.locationCache[dd]){ delete Ext.dd.DDM.locationCache[dd]; } } delete Ext.dd.DDM.ids['gridHeader' + this.grid.getGridEl().id]; } } Ext.destroy(this.splitone);//add by guig this.scroller.removeAllListeners();//add by guig this.mainHd.removeAllListeners();//add by guig Ext.fly(this.innerHd).removeAllListeners();//add by guig this.focusEl.removeAllListeners();//add by guig Ext.destroy(this.resizeMarker, this.resizeProxy); if(this.dragZone){ this.dragZone.unreg(); } this.initData(null, null); Ext.EventManager.removeResizeListener(this.onWindowResize, this); } 第二:对ie的补丁,遵循先移除子节点的规则: 引用 destroy : function(){
if(this.fireEvent("beforedestroy", this) !== false){ this.beforeDestroy(); if(this.rendered && !Ext.isIE){//if is ie then do this follow! //change by guig this.el.removeAllListeners(); this.el.remove(); if(this.actionMode == "container"){ this.container.remove(); } } this.onDestroy(); Ext.ComponentMgr.unregister(this); this.fireEvent("destroy", this); this.purgeListeners(); //VVVVVVVVVVVVVVVV add by guig if(this.rendered && Ext.isIE){//if is ie, do this after all be done, because the "this.el.remove()" will delete el and el's children in "Ext.removeNode", so child component can't get right element by element's id ("document.getElementById()" can't find element). in ie do "this.el.remove()" after onDestroy. this.el.removeAllListeners(); this.el.remove(); if(this.actionMode == "container"){ this.container.remove(); } } //^^^^^^^^^^^^^^^ add by guig //VVVVVVVVVVVVVVVV add by guig if (this._parentDivForAutoEl) {//remove the parent div for autoEl Ext.removeNode(this._parentDivForAutoEl); this._parentDivForAutoEl = null; } //^^^^^^^^^^^^^^^ add by guig } }, |
|
返回顶楼 | |
发表时间:2008-10-07
需要的就是这个,ExtJS最大的问题就是内存泄露
|
|
返回顶楼 | |
发表时间:2008-10-17
我在ExtJs Forum注册进入后,不能下载东西和发言,为什么呢?谢谢
|
|
返回顶楼 | |
发表时间:2008-10-17
先支持下,不知道2.02版的能不能用?
|
|
返回顶楼 | |
发表时间:2008-10-18
会飞的狗 写道 先支持下,不知道2.02版的能不能用?
不能,只适用2.2 |
|
返回顶楼 | |
发表时间:2008-10-18
可能把,就是说原来的ext有bug,现在没有了
if is ie, do this after all be done, because the "this.el.remove()" will delete el and el's children in "Ext.removeNode", so child component can't get right element by element's id ("document.getElementById()" can't find element). in ie do "this.el.remove()" after onDestroy. for the IE, Please call "this.el.remove()" for saving the memory. This statement will remove all the el and el's decendents, taht means other component and document.getElementById won't get the node by ID attribute. Keep in mind call "this.el.remove()" after onDestroy. Thanks............ |
|
返回顶楼 | |