2009-10-19 29 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