dojo.parser.parse只能在第一次工作时被称为
我有一个页面,当用户点击某个报告工具的链接时,它首先要求他们输入一些报告参数。基于链接的ID,我使用AJAX获取参数对话框作为表单。每个对话框都有一些dojo控件,所以我需要在对话框出现时解析它们,因为它本来不是页面的一部分。dojo.parser.parse只能在第一次工作时被称为
调用时的第一个对话框工作正常,但随后的对话调用无法解析dojo控件。
实施例:
showParametersDialog : function(doc) {
var content = doc.firstChild.firstChild.data;
var container = document.createElement('div');
container.id = 'dialog';
container.innerHTML = content;
container.style.background = 'transparent';
container.style.position = 'absolute';
container.style.top = (document.body.clientHeight/2) - 124 + "px";
container.style.left = (document.body.clientWidth/2) - 133 + "px";
container.style.display = 'block';
document.body.appendChild(container);
// set up date fields
var date_from = dojo.byId('date_from');
var date_to = dojo.byId('date_to');
try {
date_from.value = dojo.date.locale.format(new Date(), {selector: 'date'});
date_to.value = dojo.date.locale.format(new Date(), {selector: 'date'});
} catch(e) {
var now = new Date();
date_from.value = String(now.getMonth() + "/" + now.getDate() + "/" + now.getFullYear());
date_to.value = String(now.getMonth() + "/" + now.getDate() + "/" + now.getFullYear());
}
dojo.parser.parse();
}
所有对话框具有共同的日期字段。 所以当我第一次调用这个对话框,并且调用了dojo.parser.parse()时,它解析了对话框上的控件,但是仅仅是第一次...之后,没有dojo。
有什么想法?
谢谢, 保罗。
这并不是说它不是第二次解析,这是因为如果dojo尝试多次解析某个东西,它会失败。您可以使用布尔型标志跟踪它是否已被解析,如果不是,则跳过解析它的行。
if (!parsed)
{
dojo.parser.parse();
}
这可能是因为你缺少像dojo.parser.parse(container)
之类的东西。否则,它可能会尝试解析整个文档,并发现解析了元素并停止。
这里是我仍然得到的问题:当对话框在从DOM中删除,然后再次点击链接后重新追加,我得到“试图注册与ID = = date_from,但是这个id已经注册了。“那么我该如何正确地销毁dojo节点,以便我可以重用呢? 谢谢 – CrazyMerlin 2009-10-20 22:37:36
当你想要移除一个小部件时,需要调用一个”destroy“函数孩子们 – Glenn 2009-10-21 00:11:59
这个问题的答案都不是定论,我可以见证同样的行为,除了它是一些比这更随机的东西。 – 2010-07-09 12:45:30
(胡乱猜测从旧道场知识拉)你可以使用
dojo.parser.instantiate([dojo.byId("myDiv")]);
代替dojo.parser.parse(); 在所有未解析的对象上使用它。
更多关于这一点,你可以在这里找到:
好吧,我试图用: VAR列表= dojo.query( '[为widgetid]', '对话'); list.forEach( \t function(w){ \t \t w.destroyRecursive(); }); ...当对话框关闭时销毁小部件,并且我得到“对象不支持此方法”的错误!什么?当然,它支持这种方法,它在文档中! 我开始认为使用Dojo是一个不好的举措,因为它现在正在耗费我开发时间。我尝试过来自网站的例子,他们根本不工作。我正在使用1.3.2 帮助? 谢谢! – CrazyMerlin 2009-10-20 23:48:02
除了销毁递归之外,您还可以尝试使用dojo.query()调用在对话框中使用“_widgetId”获取任何内容,然后单独销毁每个对象。 – Glenn 2009-10-21 00:13:26
谢谢,但我试过用下面的代码:dojo.query('[widgetId]','dialog')。forEach(function(w){w.destroy();});每次我是否使用destroy或destroyRecursive,我都会得到“Method not supported”方法。而且因为列表只包含实际的小部件,所以这没有意义。每个人都应该有一个破坏,但系统说不。这只是没有意义。 – CrazyMerlin 2009-10-21 04:36:27