destroy(),destroyRecursive(true),destroyDescendants()之间的区别

Sum*_*ant 9 dojo

在创建一个小部件时,我检查是否存在如下所示的div,然后销毁内容并再次创建.

if (dijit.byId("TPContainer")) {
    dijit.byId("TPContainer").destroyRecursive(true);
    dojo.place('<div id="TPContainer"></div>',dojo.byId("TitleContainer"));
}
Run Code Online (Sandbox Code Playgroud)

但在加载HTML模板之前

var container = dijit.byId("mainContainer");
container.destroyDescendants();
container.set("href", TemplateLink);
Run Code Online (Sandbox Code Playgroud)

我刚从别处拿了代码.但不清楚这个概念.我不知道何时使用Dojo可用的破坏功能.有人可以解释何时使用哪种破坏功能?他们有什么区别?

Sho*_*hoe 14

看一下Dojo api(目前是1.10),这些方法定义在_WidgetBase(尽管destroy来自dijit/Destroyable)并由所有小部件继承.由于这些都埋没在api文档中,而不是写在_Widgetbase教程页面中,我将在此列出它们.

在内部,破坏Blah方法需要destroy自己(如果适用)和他们的孩子,因此这些功能就像简单的帮助方法,以便更容易破坏事物.


破坏(preserveDom)

参数: preserveDom

类型:布尔值

描述:如果为true,则此方法将单独保留原始DOM结构.注意:这不适用于_TemplatedMixin小部件

摘要:

销毁这个小部件,但不是它的后代.后代表示this.containerNode中的小部件.还会破坏通过this.own()注册的所有资源(包括小部件).

此方法还将销毁内部窗口小部件,例如从模板创建的窗口小部件,假设这些窗口小部件存在于this.domNode内部但在this.containerNode之外.

对于2.0,计划此方法也会破坏后代小部件,因此应用程序不应依赖于当前破坏小部件而不破坏其后代的能力.通常,他们应该对带子项的小部件使用destroyRecursive().


destroyDescendants(preserveDom)

参数: preserveDom

类型:布尔值

说明:(可选)如果为true,preserveDom属性传递给所有后代widget的.destroy()方法.不适用于_Templated小部件.

摘要:

递归地销毁这个小部件及其后代的子节点.


destroyRecursive(preserveDom)

参数: preserveDom

类型:布尔值

说明:(可选)如果为真,该方法将独自后代的Widgets离开了原来的DOM结构.注意:这不适用于dijit._TemplatedMixin小部件.

销毁此小部件及其后代

这是一个通用的"析构函数"函数,所有小部件用户都应调用它来使用小部件干净地丢弃.一旦窗口小部件被销毁,它就会从管理器对象中删除.


在您的第一个示例中,destroyRecursive将调用窗口小部件上的destroy(但由于true参数而不是dom元素).与你的第二个例子形成对比,在第二个例子中,仅在调用它的小部件的后代上调用destroy.由于没有preserveDom指定,它将销毁dom元素以及小部件注册表.