2014-10-10 98 views
1

使用Omniface的Components #includeCompositeComponent動態創建組合組件時,是否可以傳遞屬性值(例如屬性myValue),以便它可用於複合材料上的預渲染事件?Omnifaces組件#includeCompositeComponent設置屬性值

<composite:interface> 
    <composite:attribute name="myValue" required="true" /> 
</composite:interface> 
<composite:implementation> 
    <!-- this works! --> 
    <h:outputText value="#{cc.attrs.myValue}" /> 
    <!-- this doesn't execute --> 
    <f:event id="eventId" 
      type="javax.faces.event.PreRenderComponentEvent" 
      listener="#{bean.someAction(cc.attrs.myValue)}" /> 
    <!-- stuff --> 
</composite:implementation> 

不過,我能夠訪問myValue在XHTML(可通過#{cc.attrs.myValue}),但它不適用於預渲染(我以前UIComponent#getAttributes指定myValue的價值)。

編輯:如果該屬性也可用於@PostConstruct(通過託管屬性),它也可以。

回答

1

檢查javadoc

public static UIComponent includeCompositeComponent(UIComponent parent, String libraryName, String resourceName, String id)

...

返回: 所創建的複合部件,其可以在必要時可以進一步用於設定自定義屬性或值的表達式在上面。

所以,僅僅得到返回UIComponent實例的保持和利用UIComponent#getAttributes()把靜態值或UIComponent#setValueExpression()設置EL表達式。

UIComponent composite = Components.includeCompositeComponent(parent, library, name, id); 
composite.getAttributes().put("myValue", myStaticValue); 
// Or: 
composite.setValueExpression("myValue", Components.createValueExpression("#{bean.myValue}", String.class)); 
// ... 
+0

'setValueExpression'是否將複合屬性與bean中的值綁定('bean.myValue')?不過,要嘗試一下。謝謝 – nuno 2014-10-10 14:51:26

+0

它和''具有完全相同的效果,而'getAttribute()'方法與''只要它是一個'String'。 – BalusC 2014-10-10 14:55:03

+0

經過仔細閱讀後,我猜'setValueExpression'只是從另一個bean獲取值。我對嗎? – nuno 2014-10-10 14:55:05