我最近遇到了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初始化。