這是我在SO上的第一篇文章。在f:ajax或a4j上獲取模型值:ajax監聽器方法
我使用JSF2與Richfaces4,我有以下問題:
根據一個下拉菜單我想在面板部分輸入字段被禁用,而不是必需的,否則這些領域應啓用的價值,需要。
我已經在我的XHTML以下
<h:selectOneMenu value="#{backingBean.field}" id="ResponseType">
<f:selectItems value="#{backingBean.responseTypes}" />
<f:ajax event="change" execute="@this" render="myPanel" listener="#{backingBean.responseTypeValueChange}" immediate="true"></f:ajax>
</h:selectOneMenu>
<rich:panel id="myPanel">
<h:inputText id="input1" label="label1" value="#{backingBean.input1}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
<h:inputText id="input2" label="label2" value="#{backingBean.input2}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
<h:inputText id="input3" label="label3" value="#{backingBean.input3}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
<h:inputText id="input4" label="label4" value="#{backingBean.input4}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
</rich:panel>
我支持bean是一個Spring bean和代碼是:
public class BackingBean {
private boolean flagDisabled;
private String field;
// getters and setters
public List<SelectItem> getResponseTypes() {
...
// returns values [1: Positive], [2: Negative]
}
public void responseTypeValueChange(AjaxBehaviorEvent event) {
flagDisabled = "2".equals(field);
}
}
我的問題是,當responseTypeValueChange方法被調用的字段變量保存前一個請求的值。所以我總是得到完全相反的行爲。
我也嘗試過a4j:ajax,但我得到了相同的結果。
後來我改變擺脫這樣的事件參數的submittedValue中的方法:
public void responseTypeValueChange(AjaxBehaviorEvent event) {
if (event.getSource() instanceof HtmlSelectOneMenu) {
HtmlSelectOneMenu source = (HtmlSelectOneMenu) event.getSource();
flagDisabled = "2".equals(source.getSubmittedValue());
}
}
上述作品,但我怎麼可以更新flagDisabled值,然後調用該方法? 我覺得我的解決方案不是最好的。這實際上是一個黑客。
謝謝。
是全部在一邊的形式? –
@Ravi:是的,一切都在h:form裏面。除了該方法被調用。該字段僅具有來自先前ajax請求的值 – kpagan
該構造需要bean在視圖範圍內。春天默認沒有這樣的範圍。如果您使用的是請求範圍,那麼實質上這個bean會在請求結束時被銷燬並在每個請求中重新創建。也許你誤解了「先前的值」實際上是bean屬性的默認值。這至少會解釋你的具體問題。另請參閱http://stackoverflow.com/questions/7031885/how-to-choose-the-right-bean-scope/7031941#7031941您需要爲Spring自己實現自定義視圖範圍。 Google上有很多例子。 – BalusC