8

我想在进一步处理之前使用多个动作侦听器来设置两个支持 bean 的状态

第一种方式:

<p:commandButton process="@this" >
   <f:attribute name="key" value="#{node.getIdTestGroup()}" />
   <f:actionListener binding="#{testController.nodeListener}" />
<f:actionListener binding="#{testDeviceGroupController.prepareCreate}" />
</p:commandButton>

它给出了一个例外:

警告:/testGroup/List.xhtml @26,88 binding="#{testController.nodeListener()}": 找不到方法 nodeListener javax.el.E​​LException: /testGroup/List.xhtml @26,88 binding="#{ testController.nodeListener()}": 方法 nodeListener 未找到

第二种方式:

<p:commandButton process="@this" >
    <f:attribute name="key" value="#{node.getIdTestGroup()}" />
    <f:actionListener binding="#{testController.nodeListener(event)}" />
    <f:actionListener binding="#{testDeviceGroupController.prepareCreate(event)}" />
</p:commandButton>

nodeListener 和 prepareCreate 方法上的事件为空

怎么做才对?

4

2 回答 2

13

我看到你促进了猜测它是如何工作的传统方法,使用裸直觉和随机关联 - 然后 - 行动 - 惊讶:-)

f:actionListener仅允许您将整个对象添加为观察者,而不是任意方法。您可以使用type属性来指定类名(它将由 JSF 实例化)或binding属性来提供您自己创建的对象的实例(而不是方法!)。对象必须实现javax.faces.event.ActionListener

您的第二次尝试(testDeviceGroupController.prepareCreate(event))在许多层面上都是错误的,但关键是调用这些方法不是为了处理您的操作,而是为了创建Actionlistener实例。

你有几个选择:

  • 最理智的:只需创建一个调用每个目标方法的方法。由于它们位于不同的 bean 上,您可以将一个注入另一个。
  • 如果这对您不起作用,您可以创建一个创建侦听器对象的方法。

像这样:

public ActionListener createActionListener() {
    return new ActionListener() {
        @Override
        public void processAction(ActionEvent event) throws AbortProcessingException {
            System.out.println("here I have both the event object, and access to the enclosing bean");
        }
    };
}

并像这样使用它:

<h:commandButton>
    <f:actionListener binding="#{whateverBean.createActionListener()}"/>            
</h:commandButton>
于 2013-05-04T12:27:53.370 回答
0

binding属性值需要指向实现接口的对象,ActionListener而不是方法。

f:actionListener'sbindig属性的文档中:

计算结果为实现 javax.faces.event.ActionListener 的对象的值绑定表达式。

这里讨论了一个类似的问题。

于 2013-05-04T12:19:58.143 回答