我最近遇到了Dojo的ContentPanes问题。我将它们与TabContainer一起使用,并使它们可关闭;但是,用户操作可能会重新打开从同一来源拉取的选项卡。这导致与我必须解决的dijitID发生冲突。
大多数Dijit都有一个destroyRecursive()方法,理论上应该可以销毁其中包含的任何dijit。然而,对于许多Dijit,由于其实现方式,此功能根本不起作用;许多人实际上对它们下面的dijit一无所知。
ContentPanes属于后一类。幸运的是,由于Dojo高度面向对象的特性,它相对容易实现。
dojo.provide(\"custom.ContentPane\");
dojo.require(\"dijit.layout.ContentPane\");
dojo.declare(\"custom.ContentPane\", [dijit.layout.ContentPane], {
postMixInProperties: function(){
if (dijit.byId(this.id)) {
dijit.byId(this.id).destroyRecursive();
}
},
destroyRecursive: function(){
dojo.forEach(this.getDescendants(), function(widget){
widget.destroyRecursive();
});
this.inherited(arguments);
}
});
destroyRecursive()方法与dijit._Widget中的方法没有什么不同;不同之处在于,我们不是在任何发现的小部件上简单地调用destroy(),而是递归地销毁。
由于我遇到的IE问题,我添加了postMixInProperties方法。基本上,即使ContentPane被递归销毁,出于某种原因,IE仍保留对原始dijit的引用。postMixInProperties()检查dijitID是否仍然存在,如果存在,则递归销毁它。这允许继续进行ContentPane初始化。
