2015-03-13 23 views
1

我使用JSF 2與primefaces 5.1,我有一個selectOneButton有2個值, EN/FR,我想每次語言改變時通知,然後更改頁面的語言環境。 現在的問題是,這個selectOneButton在splitButton中,出於某種原因, 「change」事件的ajax提交對selectOneButton總是返回null,並且它永遠不會傳遞所選的值。selectOneButton不能提交,而在splitButton內

<h:form prependId="false" id="headerForm"> 
    <p:splitButton> 
     <p:menuitem> 
     <p:selectOneButton id="langs" value="#{bean.lang}" > 
      <f:selectItem itemLabel="English" itemValue="en"/> 
      <f:selectItem itemLabel="Françcais" itemValue="fr"/> 
      <f:ajax event="change"/> 
     </p:selectOneButton> 
     </p:menuitem> 
    </p:splitButton> 

這只是用於測試:

public void setLang(String lang) { 
     System.out.println("Changed: " + lang); 
     this.lang = lang; 
} 

當我把selectOneButton的p內:菜單的例子,它工作得很好。

+1

變化''到''像這樣:'' ('process =「@ this」'可以安全地省略,因爲順便說一句,它已經默認爲'@ this'。刪除'listener =「#{bean.action}」',如果不需要,就像你在示例中沒有提到的那樣)。 – Tiny 2015-03-15 21:19:41

+0

@Tiny非常感謝你,請張貼你的答案,以便我可以接受它。 – 2015-03-16 04:35:33

回答

2

這個問題是雙重的。

首先,大多數PrimeFaces組分,特別其中生成隱藏的HTML輸入元件和由一束的div被呈現給最終用戶使用點擊聽衆而不是作爲「普通的HTML」輸入/列出的那些,需要<p:ajax>代替<f:ajax>到在ajax提交期間正確處理。

<p:selectOneButton id="lang" value="#{bean.lang}" > 
    <f:selectItem itemLabel="English" itemValue="en"/> 
    <f:selectItem itemLabel="Français" itemValue="fr"/> 
    <p:ajax /> 
</p:selectOneButton> 

注意,我省略了event屬性,因爲它具有合適的默認值已經,這將是在輸入情況下valueChangeaction在命令的情況下change的值不一定是正確的默認值,因爲某些組件需要click,特別是具有固定值的單選按鈕和複選框。

在任何情況下,一般的建議是,如果您使用PrimeFaces,只需堅持<p:ajax>。它將使用PrimeFaces特定的基於jQuery的Ajax API來處理ajax請求,而不是JSF本機Ajax API,並且它能夠處理PrimeFaces組件。其次,與<p:splitButton>相關聯的JavaScript代碼將菜單的HTML表示移動到主體的末尾(以便確保與z-index相關的最佳跨瀏覽器兼容性)。但是,這會導致菜單不再以某種形式坐着。您可以通過右鍵單擊Web瀏覽器中的HTML DOM樹並點擊檢查元素(而不是查看源代碼!)來確認它。你可以用兩種方法解決這個問題:

  1. 將表單移動到菜單項中。無論如何,爲了這個特定的要求提交所有其他菜單項是沒有意義的。

    <p:splitButton> 
        <p:menuitem> 
         <h:form id="languageForm"> 
          <p:selectOneButton id="lang" value="#{bean.lang}" > 
           <f:selectItem itemLabel="English" itemValue="en"/> 
           <f:selectItem itemLabel="Français" itemValue="fr"/> 
           <p:ajax /> 
          </p:selectOneButton> 
         </h:form> 
        </p:menuitem> 
    </p:splitButton> 
    
  2. 使用<p:ajax partialSubmit="true">讓PrimeFaces AJAX API收集的,而不是尋找一個<form>serializing它(這將失敗,因爲沒有形式)的invidivual輸入值。

    <h:form id="headerForm"> 
        <p:splitButton> 
         <p:menuitem> 
          <p:selectOneButton id="lang" value="#{bean.lang}" > 
           <f:selectItem itemLabel="English" itemValue="en"/> 
           <f:selectItem itemLabel="Français" itemValue="fr"/> 
           <p:ajax partialSubmit="true" /> 
          </p:selectOneButton> 
         </p:menuitem> 
        </p:splitButton> 
    </h:form> 
    
+0

感謝您的回答,但出於某種原因,如果您放置了selectOneButton,則必須在p:ajax中添加「partialSubmit =」true「」,以便其起作用,否則,「lang」屬性始終爲空 – 2015-03-16 11:56:05

+0

查看更新的答案。 – BalusC 2015-03-16 12:44:54

+0

這很有道理......謝謝。 – 2015-03-16 12:53:39