dojo.empty() / domConstruct.empty() 到底做什么
What does dojo.empty() / domConstruct.empty() do exactly
假设我在 someNode
中注册了一些具有某些 ID(比如 id1、id2)的小部件。现在,如果我这样做,domConstruct.empty(someNode)
,这将通过执行 someNode.innerHTML= ""
从 someNode
中删除小部件。但是这些小部件还在内存中吗?
我想说的是,在domConstruct.empty(someNode)
之后,我可以用id1或id2注册一个widget吗?
如果没有,那我怎样才能达到同样的效果呢?我不想在创建过程中检查具有相同 ID 的小部件,如果存在则销毁它。
P.S:我假设 dojo.empty()
和 domConstruct.empty()
以相同的方式工作。
dojo/dom-construct
的 API 对 Dijit 小部件一无所知,因此当您 运行 domConstruct.empty(node)
或 domConstruct.destroy(node)
时,它不会查找和销毁小部件. (我 在很大程度上相关的问题。)
创建 Dijit 小部件时,它们会填充到由 dijit/registry
模块维护的散列中,这允许它们在将来通过 ID(或节点)访问。 dijit/registry.findWidgets
也被 dijit/_WidgetBase#getChildren
使用(它又被容器和布局小部件使用)根据 DOM 树检索子小部件。
由于 dojo/dom-construct
对 Dijit 一无所知,它只是销毁给定节点下的所有 DOM 节点,并且不更新 Dijit 的注册表。因此,您最终会遇到不一致的状态,Dijit 认为这些小部件仍然存在,但它们的 DOM 实际上已被销毁。正如在另一个问题中回答的那样,您应该先使用 findWidgets
正确销毁小部件,或者考虑使用布局小部件或 ContentPane
为您管理子小部件。
假设我在 someNode
中注册了一些具有某些 ID(比如 id1、id2)的小部件。现在,如果我这样做,domConstruct.empty(someNode)
,这将通过执行 someNode.innerHTML= ""
从 someNode
中删除小部件。但是这些小部件还在内存中吗?
我想说的是,在domConstruct.empty(someNode)
之后,我可以用id1或id2注册一个widget吗?
如果没有,那我怎样才能达到同样的效果呢?我不想在创建过程中检查具有相同 ID 的小部件,如果存在则销毁它。
P.S:我假设 dojo.empty()
和 domConstruct.empty()
以相同的方式工作。
dojo/dom-construct
的 API 对 Dijit 小部件一无所知,因此当您 运行 domConstruct.empty(node)
或 domConstruct.destroy(node)
时,它不会查找和销毁小部件. (我
创建 Dijit 小部件时,它们会填充到由 dijit/registry
模块维护的散列中,这允许它们在将来通过 ID(或节点)访问。 dijit/registry.findWidgets
也被 dijit/_WidgetBase#getChildren
使用(它又被容器和布局小部件使用)根据 DOM 树检索子小部件。
由于 dojo/dom-construct
对 Dijit 一无所知,它只是销毁给定节点下的所有 DOM 节点,并且不更新 Dijit 的注册表。因此,您最终会遇到不一致的状态,Dijit 认为这些小部件仍然存在,但它们的 DOM 实际上已被销毁。正如在另一个问题中回答的那样,您应该先使用 findWidgets
正确销毁小部件,或者考虑使用布局小部件或 ContentPane
为您管理子小部件。