2

每个人。我正在处理的当前项目需要一个 DOJO 选项卡式窗格来保存来自 DB 的数据,并且它需要刷新页面的一部分(一个 id 为“可刷新”的 div,其中包含选项卡式窗格 div)以保持选项卡式窗格中的数据向上-迄今为止。

这里的问题是当我用萤火虫调用以下方法时

j('#refreshable').load(url+' #refreshable > *', function (response) {
    console.log("hello");
    dojo.parser.parse(Dojo.byId('tabbedPane'));
    console.log("hello again !");
});

似乎在萤火虫控制台中只显示“你好”但没有“再次你好!” 没有任何错误信息。似乎对 Dojo 解析器的调用在 jquery reload 函数中被破坏了。

然后结果是每次刷新“可刷新”时,选项卡式窗格中的所有表都会显示在堆栈上——Dojo 解析器失败。

我该如何解决这个问题?提前致谢 !。

4

1 回答 1

1

这里有几件事是错误的:1)大写的“Dojo”。dojo 总是小写,句号。2)你“持有错误”。您需要掌握小部件实例及其生命周期的概念。

似乎您使用的是旧的 AMD 之前(1.7?左右)版本的 dojo,因为否则 dojo 不会作为全局变量导出。

如果是较新版本,则必须查看文档以获取较新版本。

那么你的 dojo 片段做了什么:

dojo.byId('foo') 返回给定 domNode 的引用,但它是 ID 属性。dojo.parser.parse(node) 解析节点,在其上查找 data-dojo-type 或 dojo-type 属性,并在其上实例化相应的小部件。

如果你多次解析,你会得到各种各样的错误,因为你正在做你不应该做的事情:

试图重新解析已经实例化的小部件。

您不能重新解析已经实例化的 dojo 小部件。即使您清除了 dom 并重置它,您也会在小部件注册表中泄漏一个实例。

你必须先摧毁它。

为此,在伪代码中:

require(['dijit/_base/registry'], function(registry){
 registry.byNode(document.getElementById('tabbedPane'))[0].destroy();
})

这个片段是异步的,因为它使用了 require。如果你使用非amd dojo,你可以简单地做dijit.byNode(document.getElementById('tabbedPane'))[0].destroy();

于 2015-06-16T09:30:29.483 回答