ExtJS新手。我有以下代码。
var comp;
console.log('comp is - ' + comp);
comp = Ext.create('Ext.Component', {
listeners : {
beforedestroy : function(comp) {
console.log('beforedestroy .. ');
},
destroy : function(comp) {
console.log('destroy .. ');
}
}
});
console.log('comp is - ' + comp);
console.log('comp id is - ' + comp.getId());
comp.destroy();
console.log('comp is - ' + comp);
console.log('comp id is - ' + comp.getId());
chrome的控制台输出是
comp is - undefined
comp is - [object Object]
comp id is - component-1009
beforedestroy ..
destroy ..
comp is - [object Object]
comp id is - component-1009
即使在组件被销毁之后,变量仍然保持对原始组件的引用。我希望变量在destroy之后具有undefined或null值。这是正常行为吗?
答案 0 :(得分:4)
由于JavaScript没有类似C ++的引用,因此Ext-JS无法使您对现有组件的引用无效。
例如:
var a = {b:2};
var b = a;
// a and b both reference `{b:2}`, there is nothing you can do
// to `{b:2}` that would change a or b to be null
您可以使用未记录的isDestroyed
属性检查组件是否已被销毁。
comp.isDestroyed // true
您还会注意到该组件已从注册表中删除
Ext.getCmp(comp.id); // undefined
答案 1 :(得分:1)
您看到的行为符合文档所声称的内容。
尝试通过删除所有事件来销毁传递给它的任何对象 侦听器,从DOM中删除它们(如果适用)并调用 他们的破坏功能(如果有的话)。这种方法主要是 用于Ext.Element和Ext.Component类型的参数,但是任何参数 Ext.util.Observable的子类可以传入。任意数量的 元素和/或组件可以在a中传递给这个函数 单个调用作为单独的参数。
来源 - http://docs.sencha.com/extjs/4.2.1/#!/api/Ext-method-destroy
如果查看源代码,它不会删除任何地方的实际组件。即,在调用destroy之后,该组件将几乎无用,但这与被垃圾收集的对象不同。