首先,请原谅我的无知和无能,所以请使用搜索引擎(我发誓我已经搜索了很长时间但经常找不到任何令人满意的答案)。
我有一个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组件(如果是,如何)?
所以,我希望有一个可能的解决方案来解决改变上述策略的一般问题,或者可能使用一些好的和不同的东西(通常我不喜欢使用任何黑客或解决方法,但是喜欢使用的是框架)。
谢谢,如果有人愿意给我指路!如果这个问题已经存在,那么很高兴找到相关的帖子并将其删除。
答案 0 :(得分: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
。