2013-07-27 33 views
0

這是我在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值,然後調用該方法? 我覺得我的解決方案不是最好的。這實際上是一個黑客。

謝謝。

+0

是全部在一邊的形式? –

+0

@Ravi:是的,一切都在h:form裏面。除了該方法被調用。該字段僅具有來自先前ajax請求的值 – kpagan

+0

該構造需要bean在視圖範圍內。春天默認沒有這樣的範圍。如果您使用的是請求範圍,那麼實質上這個bean會在請求結束時被銷燬並在每個請求中重新創建。也許你誤解了「先前的值」實際上是bean屬性的默認值。這至少會解釋你的具體問題。另請參閱http://stackoverflow.com/questions/7031885/how-to-choose-the-right-bean-scope/7031941#7031941您需要爲Spring自己實現自定義視圖範圍。 Google上有很多例子。 – BalusC

回答

1

經歷了這麼多時間,在調查有關JSF驗證另當別論了我想通了如何正確地調用該方法,而無需使用類似:

if (event.getSource() instanceof HtmlSelectOneMenu) { 
    HtmlSelectOneMenu source = (HtmlSelectOneMenu) event.getSource(); 
    flagDisabled = "2".equals(source.getSubmittedValue()); 
} 

<h:selectOneMenu>我添加的屬性execute="@this"以包括只有ajax請求中的這個元素。

奇怪的是,我在我的例子中有它,但沒有在實際的代碼中。 對不起,爲誤導性發布傢伙。

BTW:這與託管bean的範圍無關。這個bean是會話範圍的,但我甚至爲Spring創建了一個自定義View範圍,甚至沒有任何結果使用JSF @ViewScope

相關問題