论坛首页 Web前端技术论坛

ext从此没有内存泄露,让EXT走向成熟的关键补丁

浏览 20191 次
精华帖 (0) :: 良好帖 (11) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-07  
引用
http://www.extjs.com/forum/showthread.php?t=45782

该补丁包给几乎所有存在泄露的组件做了修正。
虽然补丁所描述的环境是ie,但实质上2.2在任何浏览器上都因为事件模型和组件本身销毁方法考虑不周的缘故使内存不断增长。
从2.0的组件树模型,到2.2对事件模型的修改,再到该补丁的出现,一页式的web应用真正走向成熟。呵呵。
   发表时间:2008-10-07  
要注冊才能下載,能否提供一個直接下載的地址?

要是樓主能簡單翻譯就好了。
0 请登录后投票
   发表时间:2008-10-07  
注册一下当是支持这么好的补丁,不急的话等官方的正式版吧
0 请登录后投票
   发表时间:2008-10-07  
ext 组件中都包含类似 onDispose 等方法,个人认为用户在使用时应该实现或者重写这些方法,而不能要求框架来帮你做这些事情

比如你要销毁一个节点,不能简单地调用 Ext.Element.remove() 这个方法,你要清楚你在干什么,会发生什么后果,如果该节点的子结点中不存在泄露问题那直接remove当然好,单事实并非如此,而框架级的东西要帮你做这些事情,代码冗余,开销也大
0 请登录后投票
   发表时间: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

        }

    },
0 请登录后投票
   发表时间:2008-10-07  
需要的就是这个,ExtJS最大的问题就是内存泄露
0 请登录后投票
   发表时间:2008-10-17  
我在ExtJs Forum注册进入后,不能下载东西和发言,为什么呢?谢谢
0 请登录后投票
   发表时间:2008-10-17  
先支持下,不知道2.02版的能不能用?
0 请登录后投票
   发表时间:2008-10-18  
会飞的狗 写道
先支持下,不知道2.02版的能不能用?

不能,只适用2.2
0 请登录后投票
   发表时间: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............
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics