2010-08-24 25 views
1

我有一個複合元件,其中,我通過在一個任意定義的屬性:JSF 2 - 傳遞參數進行的跨系統事件

<x:mycomp x="..."/> 

x被在CC的接口定義定義爲這樣。的mycomp實現內部我有一個事件偵聽器:

<composite:implementation> 
    <f:event type="preRenderComponent" listener="#{mycontroller.init}" /> 
</composite:implementation> 

現在我想這樣做在後端的東西與此arbitary參數x。如何通過系統事件傳遞它,如使用f:attribute標記?或者從事件中獲取源組件並通過其內部進行拖網? (說到哪裏在UIComponent中存儲了這些屬性 - 我無法找到它們,而不是屬性)。

如果不可能,這會嚴重限制系統事件的實用性。如果將組件放置在ui:repeat內,則偵聽器將多次觸發,以便在事件觸發期間穿過樹。

只有我能想到的事情就是在init編碼直接進入渲染:

<composite:implementation> 
    #{mycontroller.init(cc.attrs.x)} //returns empty string 
    <!--f:event type="preRenderComponent" listener="#{mycontroller.init}" /--> 
</composite:implementation> 

但我認爲多數民衆贊成預渲染系統事件將是。

+1

對不起,我已經閱讀了您的問題最多3次,但我似乎無法過濾/理解潛在的功能需求。你能否更新你的問題來詳細闡述一下? – BalusC 2010-08-24 16:03:25

+0

哇,快! 我傳遞一個屬性到一個複合組件。假定在渲染前必須以某種方式進行裝飾。系統事件是否可以獲得該屬性「x」以便在服務器上使用它? 與您在網站中介紹的有關通過actionlistener傳遞參數相同的事情(如果您是http://balusc.blogspot.com/2006/06/communication-in-jsf.html中的同一人)除了這次它是一個eventlistener,而不是一個actionlistener。 本質上,我正在尋找一種方法來初始化傳遞參數之前就在渲染。 – 2010-08-24 16:21:45

回答

1

也許這個答案有點晚了。

我做了一個我認爲是你正試圖解決的問題的概念證明。爲了做到這一點,你必須取出你的活動註冊,並在你的複合材料的使用頁面中進行。你的init方法可以接收一個ComponentSystemEvent,它將爲你提供複合組件,然後你可以從組件的屬性映射中訪問你的'x'屬性。

在使用頁面的代碼是這樣的:

<x:mycomp x="hola">
        <f:event type="preRenderComponent" listener="#{bean.init}"/>
</x:mycomp>

和Java代碼:

public class MyBean { 
    private String value; 

    public void init(ComponentSystemEvent e){ 
     System.out.println("x: "+e.getComponent().getAttributes().get("x")); 
    } 

} 

我希望它會有用(所以幾個月後)。