2

我正在尝试创建一个标准化的按钮面板,它将显示在我们的大多数屏幕上。由于按钮总是相同的,除了某些操作,复合组件的签名是这样的:

<composite:interface>

<composite:attribute required="true" name="fallbackOutcomeOnClose" type="java.lang.String"/>
<composite:attribute name="saveAction" method-signature="void action()"/>
<composite:attribute name="resetAction" method-signature="void action()"/>
<composite:attribute default="@form" name="processOnSave" type="java.lang.String"/>

</composite:interface>

<composite:implementation>
<partials:navigationButton title="#{msg['common.close']}" fallbackOutcome="#{cc.attrs.fallbackOutcomeOnClose}"/>

<c:if test="#{null ne cc.attrs.saveAction}">
    <p:commandButton title="#{msg['common.save']}" value="#{msg['common.save']}"
                     action="#{cc.attrs.saveAction}"
                     styleClass="btn btn-primary pull-right"
                     process="@this #{cc.attrs.processOnSave}"
                     update="@all"/>
</c:if>
<c:if test="#{null ne cc.attrs.resetAction}">
    <partials:warningWithConfimButton title="msg['common.reset']" action="#{cc.attrs.resetAction}" type="reset" styleClass="pull-right"/>
</c:if>

当我像这样将此 CC 添加到我的视图中时:

<partials:standardButtonPanel fallbackOutcomeOnClose="someview" resetAction="#{zef0302View.reset()}"
                              saveAction="#{zef0302View.save()}" processOnSave="zef0302_allg_det_id zef0302_periodika_id zef0302_indexierung_id"/>

该方法zef0302View.save()被直接调用而不传递给 CC。我究竟做错了什么?我已经将方法作为属性传递给其他组件,但我看不出我做了什么不同。

我将 Wildfly 8.1 与 JSF 2.2 一起使用。

谢谢您的帮助。

[编辑]

问题不在于属性的传递,而在于测试它们在 CC 中的存在。显然,在测试这样的<c:if test="null ne cc.attrs.resetAction"/>方法时,会调用该方法。测试也是如此not empty cc.attrs.resetAction

正确测试方法属性的存在,而不实际调用它<c:if test="cc.getValueExpression('actionMethod')">(或将它放在rendered需要的块中)。

解决方案来自另一个问题 Smutje 非常好心地指出我的注意力(见评论)。

4

0 回答 0