2012-03-18 24 views
1

我正在使用MyFaces/Primefaces,並且遇到了使用ajax獲取信息的問題。 我的頁面包含面板列表,在每個面板中,用戶可以在下拉列表中選擇值,然後單擊將更新其面板(Ajax)的複選框,我希望我很清楚。 這是我的代碼:JSF2:無法從java代碼中的HtmlSelectOneMenu獲取數據

<p:panel> 
... 
<h:selectOneMenu id="beanSet" value="#{myBean.selectedSet}"> 
    <f:selectItem itemLabel=" " noSelectionOption="true" /> 
    <f:selectItems value="#{langSet}" /> 
</h:selectOneMenu> 


<h:selectBooleanCheckbox 
id="chkbxBeanSet" 
value="#{myBean.selectedSetChkbx}" > 
    <p:ajax 
    event="click" render="@parent" 
    listener="#{action.updateSet}" 
    execute="@form" 
    immediate="true" 
    /> 
</h:selectBooleanCheckbox> 
... 
<p:panel> 

在這裏,我的Java代碼:

public void updateSet(AjaxBehaviorEvent e) { 
    UIComponent source = (UIComponent)e.getSource(); 
    System.out.println("Value:"+((HtmlSelectBooleanCheckbox)source).getValue()); 
    UIComponent parent = source.getParent(); 
    List<UIComponent> children = parent.getChildren(); 


    HtmlSelectOneMenu lvSet = (HtmlSelectOneMenu)parent.findComponent("beanSet"); 
    Object value = lvSet.getValue(); 
    System.out.println("value: " + value); 

我得到的beanSet成分,但我無法得到它的價值。據我所知,getValue調用未設置的myBean的getSelectedSet(它在請求範圍內)。 我不明白如何使用ajax獲取下拉列表中的選定值。 另一種方式是發佈所有的表單,但在這種情況下,我必須確定哪個複選框被用戶點擊... 如果有人能解釋我在哪裏我錯了?

回答

2

ajax動作的罪魁禍首是immediate="true"。這將跳過所有輸入組件而不是在處理過程中設置了該屬性。您應該調整process屬性<p:ajax>中的待處理組件。是的,另一個罪魁禍首是您使用execute而不是process<p:ajax>使用process其中<f:ajax>使用execute。另外,您訪問下拉值的方式不必要的過度複雜。直接訪問selectedSet屬性。無論如何,JSF會將它設置在同一個bean中。

所以,這應該做

<h:selectOneMenu id="beanSet" value="#{myBean.selectedSet}"> 
    <f:selectItem itemLabel=" " noSelectionOption="true" /> 
    <f:selectItems value="#{langSet}" /> 
</h:selectOneMenu> 
<h:selectBooleanCheckbox id="chkbxBeanSet" value="#{myBean.selectedSetChkbx}"> 
    <p:ajax process="@this beanSet" listener="#{action.updateSet}" update="@parent" /> 
</h:selectBooleanCheckbox> 

public void updateSet() { 
    System.out.println(selectedSet); 
} 

注意,我從<p:ajax>省略event="click"。它已經是複選框的默認值。

+0

謝謝BalusC,現在它的工作原理:-)))) – 893 2012-03-18 21:33:26

0

地方這個(監聽器是可選的),則<f:ajax event="change"是你最需要的

<f:ajax event="change" render="IdsOfComponentToRender" listener="#{myBean.someMethod}" /> 

<h:selectOneMenu id="beanSet" value="#{myBean.selectedSet}">

這裏面是聽者的簽名

public void someMethod(AjaxBehaviorEvent ev) {... 

順便說一句什麼那是updateLvSet方法,以及你在哪裏調用它,並且你不應該以這種方式訪問​​你的數據...

+0

對於複選框和單選按鈕,它應該是'click'。更好的做法是完全省略整個'event'屬性。它默認爲'valueChange',它已經爲特定的組件生成了正確的DOM事件。 – BalusC 2012-03-18 21:13:46

+0

我建議的f:ajax被告知要放在 Daniel 2012-03-18 21:25:02

+0

Hm ,我認爲你誤解了OP的具體功能要求。雖然他的代碼很混亂,但他在簡化/混淆方法名稱時有點粗心; 'updateLvSet'方法實際上應該是'updateSet',如複選框中的''所調用。 – BalusC 2012-03-18 21:29:39