2010-05-12 64 views
3
<h:selectOneMenu id="selectOneMenu" value="#{Bean1.val1}" > 
    <f:selectItems value="#{Bean1.selectItems}"/> 
    <a4j:support event="onchange" action="#{Bean1.onSelectOneMenuChange}" reRender="textbox1 , textbox2 , textbox3, textbox4" /> 
</h:selectOneMenu> 

<h:inputText id="textbox1" value="#{Bean1.textbox1}"> </h:inputText> 
<h:inputText id="textbox2" value="#{Bean1.textbox2}"> </h:inputText> 
<h:inputText id="textbox3" value="#{Bean1.textbox3}"> </h:inputText> 
<h:inputText id="textbox4" value="#{Bean1.textbox4}"> </h:inputText> 

Bean1.onSelectOneMenuChange()將(取決於所選(Bean1.val1)的值)改變的Bean1.textbox1Bean1.textbox2Bean1.textbox3Bean1.textbox4值。有時,它會改變所有文本框的值,有時它只會改變一些文本框的值。使用A4J:支持的使用h onchange事件:selectOneMenu用於

當用戶更改「selectOneMenu」下拉列表控件中的值時,JSF框架將不會調用更新模型值階段,而是直接調用Bean1.onSelectOneMenuChange()。之後,所有的文本框都是reRender。因爲未調用更新模型值階段,所以用戶輸入的值永遠不會設置爲Bean1,並且reRender之後的原始值將顯示在文本框中。

我要問:

  1. 我怎樣才能手動調用更新模型內Bean1.onSelectOneMenuChange()值階段?如何獲取Bean1.onSelectOneMenuChange()中的用戶輸入的值並將其設置爲Bean1的相應字段?

  2. 另一種方法是隻有reRender那些文本框的值在Bean1.onSelectOneMenuChange()中更新。但是,有很多情況。例如,一個值將改變所有的文本框的值,一個值可能只會改變一些文本框的值。我怎樣纔能有條件地改變?哪種方法更適合可維護性?

更新:

對於第2點,我發現的重新描繪宋健民的可以接受的EL表達式,所以我試圖用

<a4j:support event="onchange" action="#{Bean1.onSelectOneMenuChange}" reRender="#{Bean1.reRenderIDList}" /> . 

的Bean1.onSelectOneMenuChange內() ,我根據業務需求將Bean1.reRenderIDList設置爲需要成爲reRender的一組ID。頁面刷新時運行Bean1.getRenderIDList()。但是,當我在UI中更改<h:selectOneMenu>的值時,Bean1.getRenderIDList()將永不再運行。因此,該文本框不能是reRender

有什麼想法?

回答

1

你的代碼看起來不錯。沒有更新模型階段不會發生的原因(您不使用immediate=true)。如果你有對話/驗證錯誤,那麼這個動作永遠不會被調用。檢查你所經歷的階段。

+0

是的,有一些將java腳本函數分配給onblur屬性進行一些驗證。如何繞過 onchange事件的驗證階段?我只想在用戶填寫所有數據並按提交按鈕時進行此類驗證。謝謝! – 2010-05-14 02:25:53

+0

^^^對於那些希望限制發送內容的人,嘗試將'ajaxSingle'屬性設置爲'true' http://livedemo.exadel.com/richfaces-demo/richfaces/ajaxAttributes.jsf?c=ajaxattributes&tab=usage – Adam 2011-06-15 19:31:01