ExtJS:Ext.Window Prototypal继承的对象不能被破坏

时间:2014-05-23 08:12:50

标签: javascript inheritance extjs properties prototypal-inheritance

[ExtJS 3.4.0] 我有一个对Ext.Window有原型无效的课,类似这样:

function Cls_MyWindow() {

    .....

    var SaveButton = new Ext.Button({...});
    var CancelButton= new Ext.Button({...});

    .....

    Cls_MyWindow.prototype.width = Ext.getBody().getWidth() - 800;
    Cls_MyWindow.prototype.height = Ext.getBody().getHeight() - 350;
    Cls_MyWindow.prototype.plain = true;
    Cls_MyWindow.prototype.buttons = [SaveButton, CancelButton];

    .....

}

Cls_MyWindow.prototype = new Ext.Window;
Cls_MyWindow.prototype.constructor = Ext.Window;

显示此窗口时,可以通过按CancelButton或内置" x"来关闭它。 Ext.Window按钮。

当我CancelButton 关闭它时,SaveButtonCancelButton 正常销毁。 但是,如果被" x"关闭按钮,按钮无法销毁,循环将永远导致我的应用程序崩溃。

经过一些调查,我发现,在 ext-all-debug.js 中,这个:

Ext.Panel = Ext.extend(Ext.Container, {

    .....

    if(Ext.isArray(this.buttons)){
        while(this.buttons.length) {
            Ext.destroy(this.buttons[0]);
        }
    }

    .....

}

调用Ext.destroy,这个:

Ext.apply(Ext, function(){

    .....

    destroy : function(){
        Ext.each(arguments, function(arg){
            if(arg){
                if(Ext.isArray(arg)){
                    this.destroy.apply(this, arg);
                }else if(typeof arg.destroy == 'function'){
                    arg.destroy();
                }else if(arg.dom){
                    arg.remove();
                }
            }
        }, this);
    },

    .....

}());

似乎是,this.buttons - 来自按下CancelButton-是Ext.Component因此,它会被正常销毁。 虽然this.buttons - 来自" x" - 不是,导致问题

  • 为什么this.buttons在通过不同方式销毁时不是同一个对象?
  • 如果我想/需要保留继承,我有哪些解决方案/选项?

对我说一些灯是非常感激的。提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果我们保持在Ext 3.4.0边界内,没有回到普通的javascript,那么你还没有正确完成继承。继承已在Ext中实现,因此您无需转到原型,将构造函数创建为父类的实例,等等。

我们假设您要定义继承自MyWindow的{​​{1}}类:

Ext.Window

创建实例:

Ext.define('MyWindow',{
    extend:'Ext.Window'
   ,method:function(){/* some stuff */}
   ,closable:false // don't create close box
   ,closeAction:'hide'
   // etc
});

有关详细信息,请参阅Ext.define文档。

答案 1 :(得分:0)

几天后,我找到了Inheritance using prototype / “new”的答案。 底部第一个代码块周围的代码是我弄错的地方。

Cls_MyWindow.prototype = new Ext.Window;
Cls_MyWindow.prototype.constructor = Ext.Window;

" " at" new Ext.Window"操作员有我的错误。

  • 为什么 this.buttons 在通过不同方式销毁时不是同一个对象?

<强>答案: 由于new运算符,当我创建Cls_MyWindow的新实例时,总共有2个构造函数被调用:Cls_MyWindow之一,Ext.Window的另一个。{1}}。然后使他们拥有&#34;他们自己的按钮原型&#34;其中 SaveButton CancelButton Cls_MyWindow Ext.Button对象和Ext.Window中以普通对象的形式提供

使用CancelButton关闭Cls_MyWindow - &gt;这些按钮可以在Ext.Window.destroy的方式中销毁。用&#34; x&#34;关闭它 - &GT;按钮无法销毁。

<强>解决方案: 我将代码更改为

//Cls_MyWindow.prototype = new Ext.Window; the old one
Cls_MyWindow.prototype = Ext.Window.prototype;
Cls_MyWindow.prototype.constructor = Ext.Window;

一切都很完美