2011-10-07 27 views
0

爲了在另一個線程中響應Infragile的請求,我要求這是一個單獨的問題,而不是後續。我試圖解決的問題: 我從JSF1.2遷移到JSF2。在JSF1.2中一切正常。 我已經重寫了一個關鍵項目是一個複合組件,它基本上是一個在我的支持bean中通過在代碼中添加組件創建的面板。如何向後臺bean中的動態創建的組件添加ajax行爲?

特別是,我有h:inputText和h:selectOneMenu組件,我在代碼中創建了一個「Apply」h:​​commandButton。 「應用」按鈕有一個動作偵聽器,用於檢查h:inputText和h:selectOneMenu組件中的值。所有這些工作正常,但是當我獲取h:inputText或h:selectOneMenu組件中的值時,我會得到原始值,而不是用戶輸入的新值。就像我說的,這在JSF1.2(我得到了新的值)中工作得很好,但出於某種原因在JSF2中沒有。

我已經嘗試了幾件事情來解決這個問題,所以我想我會在h:inputText和h:selectOneMenu項目中添加ajax行爲,當這些組件中的值發生變化時,我可以調用另一個支持ajax行爲來獲取新值的bean監聽器。

我想添加ajax行爲到我在代碼中創建的組件(不綁定到頁面組件)。我可以創建沒有問題的組件。但是,我遇到的問題是如何將ajax行爲添加到組件。

有人可以發佈示例代碼來爲值更改或模糊事件添加ajax行爲嗎?這裏是我用來在代碼中創建組件的代碼 - 我將如何修改它以添加ajax行爲? hpg = new HtmlPanelGrid(); children = hpg.getChildren(); children.clear(); .... input = new HtmlInputText(); .... children.add(input);

我需要添加什麼樣的代碼才能代替「在此添加ajax行爲」這一行,以及對於偵聽器方法的爭論是什麼?(關於替換?????的爭論方法)?

公共無效myAjaxListener(?????){...... {

我一直試圖讓這個手柄有一段時間了。我覺得我很接近,但不知道我需要的語法。我可以提供更多關於如何獲取組件ID並在動作偵聽器中搜索值的信息,如果這有幫助的話。

感謝

回答

0

這怎麼可以動態AjaxBehaviorListener添加到侑組件:

... 
HtmlInputText inpuText = new HtmlInputText(); 
AjaxBehavior blurBehavior = new AjaxBehavior(); 
blurBehavior.addAjaxBehaviorListener(new BlurListener()); 
blurBehavior.setTransient(true); 
inputText.addClientBehavior("blur", blurBehavior) 
... 

public class BlurListener implements AjaxBehaviorListener { 

    public BlurListener() { 
    } 

    @Override 
    public void processAjaxBehavior(AjaxBehaviorEvent event) { 
     // do your job 
     HtmlInputText inputText = event.getComponent(); // your input text component 
     ... 
    } 
} 

「模糊」代表事件時,這個監聽器將被觸發。請記住,JSF組件必須支持此事件,否則它將無法工作。

然而,在你的情況,我認爲問題是,在實際submited元件值之前按鈕的ActionListener被觸發(在這裏,您可以在封面和如何構建定製的Ajax組件http://weblogs.java.net/blog/driscoll/archive/2009/10/09/jsf-2-custom-java-components-and-ajax-behaviors?force=670看到)。您可以通過將ActionListener邏輯移動到按鈕操作來解決它,通過前面提到的AJAX,也許可以通過在UIComponents(HtmlInputText,UISelectOne)中查找實際值來確定,但是立即屬性也會影響它。

+0

非常感謝您的回覆。我想我在代碼中發現了另一個我無法解釋的代碼。 「應用」按鈕是動態添加的,我添加了以下操作偵聽器:' – Burferd

+0

無法弄清楚如何添加代碼段 - 如果沒有問題,我會用另一個問題回答我的問題。 – Burferd

+0

顯然不是。我被禁止在8小時內回答自己的問題。我遇到的問題是,它看起來不像我的動作偵聽器,因爲我的「應用」按鈕沒有被調用,如果我動態添加它。我會做更多的調查並回來。再次感謝你的反饋。 – Burferd

相關問題