2012-03-29 61 views
1

我的JSF2項目中存在一些有問題的行爲。未在JSF 2中從<h:selectBooleanCheckbox>觸發的事件

我有一個下拉框h:selectOneMenu這trigers刷新頁面中的onchange = "submit();"這反過來又導致我h:dataTable與複選框h:selectBooleanCheckbox填充。

的問題是,我不明白所有從複選框中ValueChangeEvent事件 - 因爲有在最初的下拉選擇複選框,我只得到儘可能多的事件。例如:

  • 首先情況下我不改變下拉的值:在創建和我的初始下拉選擇產生3個複選框,即在表3行
    • 頁。我選擇所有複選框。
    • 當我按OK按鈕後,3 setNodeState事件被解僱。
  • 第二種情況下,我改變值下拉的:創建
    • 頁和我的初始下拉選擇產生3個複選框,即在表3點的行。
    • 然後我點擊下拉菜單並選擇不同的東西。這導致該表有10個複選框,因爲有10個MultiFileSelectMgmtBean.fileNames。我選擇所有複選框。
    • 之後我按下確定奇怪的事情發生:只有3 setNodeState事件被解僱,而不是我所期望的10。

這裏是XHTML代碼:

<tr> 
<td> 
    <h:selectOneMenu 
          value    = "#{MultiFileSelectMgmtBean.selectedLocationId}" 
          valueChangeListener = "#{MultiFileSelectMgmtBean.LocationChangeEvent}" 
          onchange   = "submit();" 
          styleClass   = "text" style="width: 250px;"> 
       <f:selectItems 
          value = "#{MultiFileSelectMgmtBean.locationsListItems}" 
          var = "location" 
          itemValue = "#{location}" 
          itemLabel = "#{location.label}"> 
       </f:selectItems> 
      </h:selectOneMenu> 
</td> 
</tr> 
<tr> 
<td> 
      <h:dataTable value="#{MultiFileSelectMgmtBean.fileNames}" var="filename"> 
        <h:column> 
          <h:selectBooleanCheckbox value    = "#{MultiFileSelectMgmtBean.fileMap[filename]}" 
                valueChangeListener = "#{MultiFileSelectMgmtBean.setNodeState}" 
                title    = "#{filename}" 
                /> 
          <h:outputText value="#{filename}" styleClass="text"/> 
        </h:column> 
     </h:dataTable>   
</td> 
</tr> 
+0

爲什麼valueChangeListener的instad您不會添加的公共無效newListenerMethod(AjaxBehaviorEvent事件){} – Daniel 2012-04-06 13:23:51

+0

不知道爲什麼。 :-)我準備將所有代碼轉移到ajax。但這個需要做舊風格。 – Danijel 2012-04-06 13:28:30

+0

如果你在jsf2沒有理由不使用它的好處,使用onchange =「submit();」對於jsf1是好的...而不是你更好的f:ajax render =「@ form」.... – Daniel 2012-04-06 13:31:36

回答

1

問題是支持bean consturctor。我一直在初始化首選的下拉框。然後該事件會將其更改爲其他選擇。

現在我將下拉狀態保存爲會話變量。當bean被創建時,它首先檢查是否保存了這個狀態,如果是,則加載它。