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() 中的参数太少