如何通过按 id 注册但未在任何 DOM 节点中引用来删除 dojo 小部件

How to remove dojo widgets by registered by id, but not referenced in any DOM node

本文关键字:引用 节点 删除 小部 dojo DOM 任何 id 何通过 注册      更新时间:2023-09-26

>上下文:我正在开发一个应用程序,该应用程序现已转换为单页应用程序。应用程序中有许多小部件,其中许多已被分配了 id,因此在需要时可以轻松获取它们。当我们在应用程序内部导航时,domNode 被domConstruct.empty(this.someNode)清除,新的 DOM 被放置在其中。

这里发生的问题是,尽管 DOM 被清除,但小部件仍然由相同的 id 注册,当我们再次导航到该页面时,它什么也没显示。(甚至没有例外。在Chrome,Firefox,IE中尝试过(

它以前工作正常,因为在导航过程中,每次打开带有新链接的新页面时,因此没有与 id 相关的问题。

那么,如何删除由 id 注册但未被任何 domNode 引用的小部件?

PS:我知道问题与小部件的 id 有关,因为当我只注册一个带有 id 的小部件时,它是第一次注册的,但是当我在调试时再次导航到那里时,在那一步,小部件没有注册,也没有例外。

编辑1:使用this.own((是解决方案吗?

从表面上看,您正在寻找dijit/registry.findWidgets

require([ 'dojo/_base/array', 'dojo/dom-construct', 'dijit/registry' ], function (arrayUtil, domConstruct, registry) {
    arrayUtil.forEach(registry.findWidgets(this.someNode), function (widget) {
        widget.destroyRecursive();
    });
    domConstruct.empty(this.someNode);
});

如果您通常处理经常需要清除或刷新的自由格式内容区域,则可能需要查看dijit/layout/ContentPane