在某些条件下,在复合组件上设置的JSF客户端行为会被触发两次

时间:2016-10-11 15:24:52

标签: ajax jsf jsf-2 listener composite-component

我们来看下面的例子:

复合组件如下:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:cc="http://xmlns.jcp.org/jsf/composite"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">

    <!-- INTERFACE -->
    <cc:interface>
        <cc:clientBehavior name="click" targets="button" event="click"/>
    </cc:interface>

    <!-- IMPLEMENTATION -->
    <cc:implementation>
        <span id="#{cc.clientId}">
            <h:commandButton id="button" value="Press me">
                <f:ajax event="click" listener="#{bean.helloFromComposite()}"/>
            </h:commandButton>
        </span>
    </cc:implementation>
</html>

使用页面如下:

<h:form id="form">                   
    <my:button id="my-button">
        <f:ajax event="click" listener="#{bean.HelloFromPage()}"/>
    </my:button>
</h:form>

然后,当我点击按钮时,bean会记录:

  • 来自复合材料的你好
  • 您好,来自页面
  • 来自复合材料的你好
  • 您好,来自页面

使用Omnifaces 2.5.1和Primefaces 6.0在Glassfish 4.1.1上重现。

如果我按如下方式更改我的使用页面,则问题将消失:

<h:form id="form">                   
    <my:button id="my-button">
        <f:ajax event="click" listener="#{bean.HelloFromPage()}" execute="@none"/>
    </my:button>
</h:form>

当我点击按钮时,bean现在记录:

  • 来自复合材料的你好
  • 您好,来自页面

我有两个问题:

  1. 这是一种已知行为吗?
  2. 序列是“Hello from composite”,“Hello from page”设计?我很好,因为在我看来,复合内部的ajax行为比使用页面中指定的ajax行为更具体(并且应该首先执行)。
  3. 修改 我可以用一种非常简单的方式重现问题,如下所示:

    <h:form>                   
        <h:commandButton>
            <f:ajax event="click" listener="#{bean.helloOne()}"/>
            <f:ajax event="click" listener="#{bean.helloTwo()}"/>
        </h:commandButton>
    </h:form>
    

    通过在第二个AJAX调用中添加execute @none属性来解决:

    <h:form>                   
        <h:commandButton>
            <f:ajax event="click" listener="#{bean.helloOne()}"/>
            <f:ajax event="click" listener="#{bean.helloTwo()}" execute="@none"/>
        </h:commandButton>
    </h:form>
    

    按钮“点击”和按钮“执行”之间是否存在混淆?

0 个答案:

没有答案