2011-03-02 23 views
0

這是我昨天遇到的一個問題的延續,所以如果它看起來很熟悉,那就是爲什麼:)這是一個不同的問題!dijit.form.Select重新出現無人填充?

因此,我有另一個dijit.form.Select最初在頁面上創建像這樣;

<c:set var="clazzId" value="${verification.clazz.id}" /> 
<div id="clazzOptions"> 
    <select id="clazz" name="clazz" style="width:22em" dojoType="dijit.form.Select" maxHeight="140"> 
     <option value="-1" label="      " /> 
     <c:forEach items="${requestScope.clazzes}" var="clazzItem"> 
      <c:choose> 
       <c:when test="${clazzId eq clazzItem.id}"> 
        <option value="${clazzItem.id}" selected = "true">${clazzItem.name}</option> 
       </c:when> 
       <c:otherwise> 
        <option value="${clazzItem.id}">${clazzItem.name}</option> 
       </c:otherwise> 
      </c:choose> 
     </c:forEach> 
    </select> 
</div> 

然後我有一些JavaScript,我試圖用交換依賴於從不同下拉(這裏不可見)選擇的值格「clazzOptions」的內容。如果它有一個特定的值,用一個文本信息替換div,如果它的任何其他值,重新顯示原始的dijit.form.Select;

<script type="text/javascript"> 
    var classDropDown; 
    var classPhDMessage = "PhD's do not require a Class or Grade"; 

    dojo.addOnLoad(function() { 
     classDropDown = dojo.byId('clazzOptions').innerHTML; 
    }); 

    function checkForPHD() { 
     var awardOption = dijit.byId('qualification').attr('displayedValue'); 

     if(awardOption == "PhD"){ 
      dojo.byId('clazzOptions').innerHTML = classPhDMessage; 
     } else { 
      dojo.byId('clazzOptions').innerHTML = classDropDown; 
     } 
    } 
</script> 

正如你可以看到我試圖捕捉innerHTMLof股利,因爲它是在頁面加載時,然後根據在其他下拉(不可見)選擇的值預定義的消息之間的變化和捕獲的div內容。

問題是,原始div內容已被替換爲消息,然後選擇再次改變離開「PhD」並且原始div innerHTML被放回到div中後,dijit.form.Select將重新放回到div中,出現,但是完全是空的,事實上根本不可用?如果我刪除了dijit.form.Select dojoType,並將其作爲一個正常選擇,這整個操作完美的作品,但我有點需要它是一個dijit.form.Select。

爲什麼dijit.form.Select不能在這種情況下工作,而正常的選擇呢?

回答

0

您不應該使用innerHTML來添加/刪除dijits,特別是如果您嘗試重新使用它們。

dijit是HTML和Javascript的組合,可以被認爲是比特定節點的內容更「複雜」。

你有多種選擇:解釋爲什麼它禁用

  1. 禁用您dijit.form.Select並在其下添加一個小紙條(或設置它的值)(這通常是不是刪除控制更好的UI範式) 。根據您的用戶界面,這是我想要做的

  2. 創建一個<span>作爲您的dijit.form.Select的同胞並使用CSS來一次顯示/隱藏其中一個。

    顯然,你仍然會得到dijit.form.Select的值,當您提交表單,而是因爲你做服務器端驗證和客戶端驗證(我希望:)這不會是一個問題

  3. 使用dojo.data API從您的"${requestScope.clazzes}"迭代器創建數據存儲。當您(以編程方式)創建dijit.form.Select時,請使用此商店。跟蹤Select某處的當前值。當您不需要它時,請致電yourSelect.destroy()以正確銷燬它,然後再次需要時創建一個新的並將其值設置爲之前保存的值。

    這對我來說似乎不必要的昂貴。

+0

我剛剛跟選項1一起到最後,保持簡單愚蠢! – 2011-03-07 10:46:29