的所有人。我正在处理的当前项目需要一个DOJO选项卡,用于保存来自数据库的数据,它需要刷新页面的一部分(id为“可刷新”的div,其中包括选项卡式窗格div)以保持选项卡式窗格中的数据-至今。
这里的问题是我用firebugs调用以下方法
j('#refreshable').load(url+' #refreshable > *', function (response) {
console.log("hello");
dojo.parser.parse(Dojo.byId('tabbedPane'));
console.log("hello again !");
});
似乎在firebug控制台中只显示“hello”但没有“再次问好”!没有任何错误消息。似乎在jquery重载函数中打破了Dojo解析器的调用。
然后结果是每次'refreshable'刷新,然后选项卡窗格中的所有表都显示在堆栈上 - Dojo解析器失败。
如何解决此问题?提前谢谢!。
答案 0 :(得分:1)
这里有一些错误: 1)大写" Dojo"。道场总是小写的,时期。 2)你错了"坚持错误"。您需要掌握小部件实例及其生命周期的概念。
似乎你使用的是旧的pre-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();