2012-04-27 73 views
0

首先,請原諒我的無知和無法使用搜索引擎(我發誓我搜索了很長時間,但經常沒有找到任何令人滿意的答案)。將actionListener方法傳遞給組件內的命令按鈕

我有實現操作偵聽器兼容的方法一個bean:

@ManagedBean(name = "myBean") 
@ViewScoped 
class Bean{ 
    public String myAction(ActionEvent event){ 
     ... = event.getComponent().getAttributes().get("something"); 
    } 
} 

然後,我有一個JSF組件是這樣的:

<composite:interface> 
    <composite:attribute name="actionBean" required="true"/> 
    <composite:attribute name="actionMethod" method-signature="void myAction(javax.faces.event.ActionEvent)" /> 
</composite:interface> 
<composite:implementation> 
     <h:form> 
      <p:commandButton actionListener="#{cc.attrs.actionBean[cc.attrs.actionMethod]}"> 
       <f:attribute name="something" value="somevalue" /> 
      </p:commandButton> 
     </h:form> 
</composite:implementation> 

它被稱爲是這樣的:

<namespace:myComponent actionBean="#{myBean}" actionMethod="myAction" /> 

我知道這個電話不工作,我想知道如何做到這一點!

我的主要意圖是,我想有一個相對通用的jsf組件(稍後將很好使它可重用),它包含一個按鈕。點擊這個按鈕我想傳遞一個對象(沒有簡單的字符串!在字符串的情況下,我只會使用action="..."並通過f:param傳遞它)。通過actionListener方法,我通過event.getComponent().getAttributes().get("something")獲取對象。

我認爲簽名void myAction(javax.faces.event.ActionEvent)是中斷將相關方法傳遞給組件的問題,不是嗎?是否可以通過任何參數傳遞方法到jsf組件(如果是,如何)?

所以,我希望有一個可能的解決方案來解決改變上述策略的一般問題,或者使用一些不錯的和不同的東西(通常我不喜歡使用任何黑客或變通辦法,但喜歡使用意圖由框架)。

謝謝,如果有人會找到時間指點我!如果這個問題已經存在,將很高興去相關的文章,並刪除這個。

回答

3

嘗試以下操作:

<namespace:myComponent myAction="#{myBean.myAction}"/> 

和複合組件:

<composite:interface> 
    <composite:attribute name="myAction" 
         required="true" 
         method-signature="void myAction(javax.faces.event.ActionEvent)" 
         targetAttributeName="actionListener"/> 
</composite:interface> 
<composite:implementation> 
    <h:form> 
     <p:commandButton id="myAction"> 
      <f:attribute name="something" value="somevalue" /> 
     </p:commandButton> 
    </h:form> 
</composite:implementation> 

檢查composite:attribute文檔。它有幾個選項可以將偵聽器傳遞給複合組件。我爲此使用了targetAttributeName

+0

謝謝Nikita!這似乎是一個很好的方法來做到這一點!無論如何,我有一些問題,實際上將方法傳遞給組件,意味着什麼時候通過'myAction =「#{myBean.myAction}」'它總是搜索_attribute_不是爲了方法,爲了調試我試過'myAction =「 #{myBean.myAction(event)}「',並且調用傳遞給方法,是的!但是,在'myAction(ActionEvent event){''event'爲null ...任何想法,如果我可以從表達式上下文訪問/傳遞'event'?不管怎麼說,還是要謝謝你! – 2012-04-27 12:18:39

+0

檢查http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/composite/actionSource.html。你可以嘗試添加''然後像這樣使用:'' – 2012-04-27 15:44:03