Ben*_*Ben 13 facelets composite-component jsf-2
标题真的说明了一切.我已经尝试了失败的错误:
Illegal attempt to pass arguments to a composite component lookup expression (i.e. cc.attrs.[identifier]).
我的尝试看起来像这样:
<composite:interface>
<composite:attribute name="removeFieldAction" method-signature="void action(java.lang.String)" />
</composite:interface>
<composite:implementation>
<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction('SomeString')}"/>
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
Bal*_*usC 32
这确实无法奏效.之后你不能传递"额外"参数.在method-signature你已经声明在其中被使用的复合材料部件的一侧被满足.例如
<my:button action="#{bean.remove('Somestring')}" />
Run Code Online (Sandbox Code Playgroud)
复合组件实现应该如下所示
<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction}" />
Run Code Online (Sandbox Code Playgroud)
如果这不是您想要的,并且您真的想要从复合组件侧传递它,那么我可以想到两种传递额外参数的方法:使用<f:attribute>动作侦听器将其作为attidional组件属性传递,或者<f:setPropertyActionListner>让JSF在调用操作之前将其设置为属性.但是两者都没有在复合组件中没有变化.您至少需要请求整个bean作为复合组件的属性.
这是一个例子<f:setPropertyActionListener>.这会在调用操作之前设置属性.
<composite:interface>
<composite:attribute name="bean" type="java.lang.Object" />
<composite:attribute name="action" type="java.lang.String" />
<composite:attribute name="property" type="java.lang.String" />
</composite:interface>
<composite:implementation>
<h:commandButton value="Remove" action="#{cc.attrs.bean[cc.attrs.action]}">
<f:setPropertyActionListener target="#{cc.attrs.bean[cc.attrs.property]}" value="Somestring" />
</h:commandButton>
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)
哪个用作
<my:button bean="#{bean}" action="removeFieldAction" property="someString" />
Run Code Online (Sandbox Code Playgroud)
使用上面的示例,bean应该看起来像
public class Bean {
private String someString;
public void removeFieldAction() {
System.out.println(someString); // Somestring
// ...
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果您遵守特定约定,您甚至可以property完全省略该属性.
| 归档时间: |
|
| 查看次数: |
25256 次 |
| 最近记录: |