我想以编程方式添加复合组件,并通过接口属性为primefaces命令按钮添加动作侦听器。 问题:永远不会执行监听器方法。
我的复合组件具有delcard listener属性:
<composite:interface>
<composite:attribute name="bean"/>
<composite:attribute name="listener" required="false" method-signature="void reportClickedAction(javax.faces.event.ActionEvent)"/>
</composite:interface>
<composite:implementation>
<h:outputScript library="js/composite" name="KpiPast.js"/>
<h:panelGroup rendered="#{cc.attrs.bean.showButtons}">
<p>
<h:form>
<!-- Primefaces button using the listener -->
<p:commandButton id="testbutton" value="prime" ajax="true" actionListener="#{cc.attrs.listener}"/>
</h:form>
</p>
</h:panelGroup>
</div>
</composite:implementation>
如果我在.xhtml文件中使用此组件,如下例所示,它可以正常工作。
<qc:kpi-past bean="#{dynamicPageController.kpipast}" listener="#{statisticController.reportClickedAction}" />
如果我以编程方式呈现它,就像在此Ian McLaird's answer中那样,如果单击按钮,则不会调用侦听器方法。我使用omnifaces进行渲染。这是渲染代码:
UIComponent composite = Components.includeCompositeComponent(parent, Content.CONTENT_LIBRARYNAME, KpiPast.RESOURCENAME, this.getId());
Map<String, Object> attributes = composite.getAttributes();
// create MethodExpression
MethodExpression listener = Components.createMethodExpression("#{statisticController.reportClickedAction}", Void.class, javax.faces.event.ActionEvent.class);
// add MethodExpression as attribute
attributes.put("listener", listener);
attributes.put("bean", this);
parent.getChildren().add(composite);
这是我的倾听者方法:
public void reportClickedAction(ActionEvent actionEvent) {
logger.info("reportClickedAction");
}
我做错了什么?为什么我的以编程方式生成的复合元素中的侦听器仅在页面提交时才有效?出于测试目的,我还尝试使用ajax事件而不是相同的结果,它不起作用。
但是在测试时我发现一旦表单被提交(没有特定的操作值),页面就会被重新加载,我的监听器正在首页调用中工作。例如,如果我在.xhtml中提交以下表单,其中包含我生成的复合元素,页面重新加载,我的听众正在工作:
<h:form>
<h:commandButton type="submit" value="submit"/>
</h:form>