2013-02-25 24 views
1

我有一個關於將ActionListener委託給複合組件(jsf)的具體問題。 我創建了一個複合組件來顯示(瀏覽)並編輯任何個人用戶數據(屬性「user」)。ActionListener不在複合組件中觸發

<body> 
     <co:interface> 
      <co:attribute name="editAction"  required="false" targets="edit" method-signature="java.lang.String f()"/> 
      <co:attribute name="saveAction"  required="false" targets="save" method-signature="java.lang.String f()"/> 
      <co:attribute name="cancelAction" required="false" targets="cancel" method-signature="java.lang.String f()"/> 
      <co:attribute name="isBrowseModus" required="true"/> 
      <co:attribute name="user"   required="true"/> 
      <co:attribute name="isDeveloper" required="true"/> 
      <co:actionSource name="edit"/> 
      <co:actionSource name="save"/> 
      <co:actionSource name="cancel"/> 
     </co:interface> 
............ 
     <p:inplace id="inpLand" editor="true" 
      toggleable="#{not cc.attrs.isBrowseModus}" 
      style="#{cc.attrs.isBrowseModus ? 'color: black' : 'color: blue'}"> 
       <p:inputText value="#{cc.attrs.user.land}" label="text"/> 
     </p:inplace> 
........... 
     <c:if test="#{cc.attrs.isBrowseModus}"> 
     <h:commandButton id="edit" value="Edit"/> 
     </c:if> 
........ 

實際上這個複合部件是通過調用myData.xhtml的圖稱爲:

 <ui:define name="center"> 
      <h3>MyData Developer </h3> 
      <h4>Welcomne</h4> 
      <h:form id="dataForm"> 
       <mc:UserData user="#{dataBean.user}" isDeveloper="#{dataBean.developer}" isBrowseModus="#{dataBean.browseModus}" cancelAction="#{dataBean.cancel}" 
saveAction="#{dataBean.save}" editAction="#{dataBean.edit}"> 
        <f:actionListener for="edit" binding="#{dataBean.editActionListener}"/> 
       </mc:UserData> 
      </h:form> 
     </ui:define> 
    </ui:composition> 

在複合部件有一個(ID =編輯)和遞送的ActionListener(見F: myData中的actionListener)應該綁定到這個commandButton(id = edit)。這是我閱讀不同的論壇討論和幾個文件後的理解。

不幸的是editActionListener方法在單擊Edit-Button之後不會觸發,我不知道爲什麼。

public void editActionListener(ActionEvent ae) { 
    browseModus = false; 
    FacesContext.getCurrentInstance().renderResponse(); 
}  

什麼是我的目標: 在該複合材料部件,用戶可以通過點擊「編輯」按鈕更改 這肯定editActionListener方法managedBean「公司Databeans」(myData.java)中存在任何用戶數據。我更喜歡使用PRIMEFACES的就地標籤。點擊編輯按鈕後,所有可更改的字段應以藍色顯示。

我的問題:

  1. 任何人可以解釋我爲什麼有界editActionListener方法 不解僱?
  2. 通常,這是將 「isBrowseModus」屬性設置爲正確的方法(單擊編輯按鈕後爲false)?還是有更方便的方法來達到這個結果?
  3. 我正在使用primefaces,第一次嘗試使用p:commandButton, ,但不幸的是它不起作用。在使用p:commandButton時,單擊編輯按鈕後會發生異常。在我的managedBean (PropertyNotFoundException)中,JSF找不到 editActionListener方法?!?!?

任何幫助將不勝感激。提前謝謝了。 問候, 博多

+0

這可能會幫助:http://stackoverflow.com/questions/8423096/jsf2-0-composite-component-actionlistener – 2013-02-25 15:13:54

回答

1

根據該tag documentation,所述<f:actionListener binding>必須參考實施ActionListener接口,而不是一個方法中表達的具體實例。

總而言之,您的問題可以通過提供具體的ActionListener接口實現來解決,該接口通過getter進而調用所需的動作偵聽器方法。

private ActionListener editActionListener = new ActionListener() { 
    @Override 
    public void processAction(ActionEvent event) throws AbortProcessingException { 
     DataBean.this.editActionListener(event); 
    } 
}; 

public ActionListener getEditActionListener() { 
    return editActionListener; 
} 

public void editActionListener(ActionEvent event) { 
    browseModus = false; 
    FacesContext.getCurrentInstance().renderResponse(); 
} 

然而,這是笨拙的,這表明你正在尋找解決方案可能是錯誤的方向。更簡單的方法是使用<cc:attribute targets="edit">代替。

<cc:interface> 
    ... 
    <cc:attribute name="actionListener" targets="edit" /> 
</cc:interface> 

被用作

<mc:UserData ... actionListener="#{dataBean.editActionListener}" /> 
+0

非常感謝您!是的,我認爲我在jsf知識方面存在一些差距。 也許,親愛的BalusC,你可以給我一個關於標誌(布爾值)的建議。我的建議是在editActionListener中將其設置爲true。現在列表者被炒魷魚,但他旗子仍然設置爲虛假:( 你有什麼想法嗎? 非常感謝提前 – bonaly 2013-02-25 22:56:22

+0

對不起,BalusC,我忘了給你答案。 – bonaly 2015-11-04 16:37:23