destroy()、destroyRecursive(true)、destroyDescendants() 的区别

Posted

技术标签:

【中文标题】destroy()、destroyRecursive(true)、destroyDescendants() 的区别【英文标题】:Difference between destroy(), destroyRecursive(true), destroyDescendants() 【发布时间】:2014-06-25 12:29:20 【问题描述】:

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

if (dijit.byId("TPContainer")) 
    dijit.byId("TPContainer").destroyRecursive(true);
    dojo.place('<div id="TPContainer"></div>',dojo.byId("TitleContainer"));

但在加载 html 模板之前

var container = dijit.byId("mainContainer");
container.destroyDescendants();
container.set("href", TemplateLink);

我刚刚从其他地方获取了代码。但不清楚这个概念。 我不知道何时使用 Dojo 提供的破坏功能。有人可以解释什么时候使用哪个破坏功能吗?以及它们的区别是什么?

【问题讨论】:

【参考方案1】:

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

在内部,destroyBlah 方法会为它们自己(如果适用)和它们的子级调用 destroy,因此这些函数作为简单的辅助方法,可以更轻松地销毁事物。


destroy(preserveDom)

参数: preserveDom

类型:布尔值

说明:如果为 true,则此方法将不理会原始 DOM 结构。注意:这不适用于 _TemplatedMixin 小部件

总结:

销毁此小部件,但不销毁其后代。后代的意思 this.containerNode 内的小部件。也会破坏任何资源 (包括小部件)通过 this.own() 注册。

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

对于 2.0,计划此方法也将销毁后代 小部件,因此应用程序不应依赖于当前的能力来销毁 小部件而不破坏其后代。通常他们应该使用 destroyRecursive() 用于带有子元素的小部件。


destroyDescendants(preserveDom)

参数: preserveDom

类型:布尔值

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

总结:

递归销毁此小部件的子级及其后代。


destroyRecursive(preserveDom)

参数: preserveDom

类型:布尔值

说明:可选)如果为真,此方法将保留原始 DOM 结构,只保留后代 Widget。注意:这不适用于 dijit._TemplatedMixin 小部件。

销毁此小部件及其后代

这是所有小部件用户都应该使用的通用“析构函数” 调用以使用小部件彻底丢弃。一旦一个小部件被销毁,它 从管理器对象中移除。


在您的第一个示例中,destroyRecursive 将对被调用的小部件(但不是 dom 元素,因为 true 参数)调用destroy。将其与您的第二个示例进行对比,其中仅在调用它的小部件的后代上调用destroy。由于没有指定preserveDom,它将破坏 dom 元素以及小部件注册表。

【讨论】:

以上是关于destroy()、destroyRecursive(true)、destroyDescendants() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

高分求java 的Servlet.destroy()异常,寻求解决办法

Laravel 函数 Model::destroy() 中的参数太少

会话未设置,还是 session_destroy? [复制]

session_destroy() 没有让我退出

我的 rails 嵌套模型无法识别 _destroy 属性

Ext中何时会自动去执行destroy方法