2012-01-23 104 views
4

我看了其他類似的帖子,但沒有任何幫助。這裏是我的代碼:JSF valuechangelistener沒有調用表單提交

<script type="text/javascript"> 
function submit1() 
{ 
document.forms["form"].submit(); 
} 
</script> 

<form name="form"> 
    <h:selectOneMenu value="#{bean.categorySelected}" onchange="submit1()" 
valueChangeListener="#{bean.changeCategory}"> 
    <f:selectItem itemLabel="Select a Category" itemValue="null" /> 
    <f:selectItems value="#{bean.items}" /> 
</h:selectOneMenu> 
</form> 

當我從下拉列表中選擇,它只會重新加載組件。這意味着bean.getItems被調用,但不是值或valueChangeListener,我的日誌表明它只經歷階段1和階段6.如果我沒有記錯,階段2-5不會觸發,除非表單被提交。我究竟做錯了什麼?

回答

3

您需要一個完整的JSF <h:form>組件,而不是簡單的HTML <form>元素。一個普通的HTML <form>元素沒有任何methodaction屬性會在默認提交當前URL的GET請求時觸發。這證實了你所看到的行爲。就像你剛剛刷新F5所要求的頁面一樣。

<h:form> 
    <h:selectOneMenu value="#{bean.categorySelected}" onchange="this.form.submit()" valueChangeListener="#{bean.changeCategory}"> 
     <f:selectItem itemLabel="Select a Category" itemValue="null" /> 
     <f:selectItems value="#{bean.items}" /> 
    </h:selectOneMenu> 
</h:form> 

(請注意,附加的JS函數是不必要的)

<h:form>將生成具有至少兩個JSF特定隱藏輸入沿着<form method="post">

所以,如下解決它標識當前表單和視圖狀態的字段(在修復JSF代碼後,檢查生成的HTML輸出的差異)。 POST請求和兩個隱藏字段的組合使JSF知道它必須處理哪些視圖,以及需要處理什麼樣的表單以及它必須調用哪些偵聽器和操作。

+0

你是對的,它現在就像你說的那樣工作。感謝您提供全面(快速)的答案! – Mark

+0

不客氣。 – BalusC