2009-10-19 66 views
2

我有一个页面,当用户点击某个报告工具的链接时,它首先要求他们输入一些报告参数。基于链接的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。

有什么想法?

谢谢, 保罗。

+0

好吧,我试图用: VAR列表= dojo.query( '[为widgetid]', '对话'); list.forEach( \t function(w){ \t \t w.destroyRecursive(); }); ...当对话框关闭时销毁小部件,并且我得到“对象不支持此方法”的错误!什么?当然,它支持这种方法,它在文档中! 我开始认为使用Dojo是一个不好的举措,因为它现在正在耗费我开发时间。我尝试过来自网站的例子,他们根本不工作。我正在使用1.3.2 帮助? 谢谢! – CrazyMerlin 2009-10-20 23:48:02

+0

除了销毁递归之外,您还可以尝试使用dojo.query()调用在对话框中使用“_widgetId”获取任何内容,然后单独销毁每个对象。 – Glenn 2009-10-21 00:13:26

+0

谢谢,但我试过用下面的代码:dojo.query('[widgetId]','dialog')。forEach(function(w){w.destroy();});每次我是否使用destroy或destroyRecursive,我都会得到“Method not supported”方法。而且因为列表只包含实际的小部件,所以这没有意义。每个人都应该有一个破坏,但系统说不。这只是没有意义。 – CrazyMerlin 2009-10-21 04:36:27

回答

0

这并不是说它不是第二次解析,这是因为如果dojo尝试多次解析某个东西,它会失败。您可以使用布尔型标志跟踪它是否已被解析,如果不是,则跳过解析它的行。

if (!parsed) 
{ 
    dojo.parser.parse(); 
} 
0

这可能是因为你缺少像dojo.parser.parse(container)之类的东西。否则,它可能会尝试解析整个文档,并发现解析了元素并停止。

+0

这里是我仍然得到的问题:当对话框在从DOM中删除,然后再次点击链接后重新追加,我得到“试图注册与ID = = date_from,但是这个id已经注册了。“那么我该如何正确地销毁dojo节点,以便我可以重用呢? 谢谢 – CrazyMerlin 2009-10-20 22:37:36

+0

当你想要移除一个小部件时,需要调用一个”destroy“函数孩子们 – Glenn 2009-10-21 00:11:59

+0

这个问题的答案都不是定论,我可以见证同样的行为,除了它是一些比这更随机的东西。 – 2010-07-09 12:45:30

1

(胡乱猜测从旧道场知识拉)你可以使用

dojo.parser.instantiate([dojo.byId("myDiv")]); 

代替dojo.parser.parse(); 在所有未解析的对象上使用它。

更多关于这一点,你可以在这里找到:

http://livedocs.dojotoolkit.org/dojo/parser