复合组件中的ajax侦听器在添加clientBehavior时停止工作

时间:2018-01-20 23:59:25

标签: ajax jsf primefaces composite-component

我有这个复合组件,它完美无缺。

<cc:interface>
    <cc:attribute name="listenerController" ... />
</cc:interface>

<cc:implementation>
    <p:outputPanel id="selectOnePanel">
        <p:selectOneMenu id="selectOne" ... >
            <f:selectItems ... />
            <p:ajax event="change" listener="#{listenerController.listenerMethod()}" ... />
        </p:selectOneMenu>
    </p:outputPanel>
</cc:implementation>

但我想听听&#34;改变&#34;来自此组件外部的事件。所以我使用了&#34; cc:clientBehavior&#34;在cc:界面中。为了测试的目的,我添加了几个&#34; console.out&#34; s。

首先我更新了复合组件:

<cc:interface>
     <cc:attribute name="listenerController" ... />
     <cc::clientBehavior name="change" targets="#{cc.clientId}":selectOne" event="change" />
</cc:interface>

<cc:implementation>
    <p:outputPanel id="selectOnePanel">
        <p:selectOneMenu id="selectOne" ... >
            <f:selectItems ... />
            <p:ajax event="change" listener="#{listenerController.listenerMethod()} 
                    onstart="console.log(1);" oncomplete="console.log(2); ... />
        </p:selectOneMenu>
    </p:outputPanel>
</cc:implementation>

我将如何使用它:

<xx:compostiteComponentName>
    <p:ajax event="change" onstart="console.log(3)"; oncomplete="console.log(4);" />
</xx:compostiteComponentName>

问题是复合组件中的侦听器停止工作。所有&#34; onstart&#34;和#34; oncomplete&#34; s似乎都有效,因为控制台输出是:

1
2
3
4

为什么听众会停止工作?

1 个答案:

答案 0 :(得分:0)

1-Composite组件仅针对本地组件,因此没有#{cc.id}:

<cc:interface>
    <cc:attribute name="listenerController" ... />
    <cc::clientBehavior name="change" targets="selectOne" event="change" />
</cc:interface>

2-别忘了告诉听众有关复合词的用法:

<xx:compostiteComponentName>
    <p:ajax event="change" listener="#{listenerController.listenerMethod()} 
                onstart="console.log(3);" oncomplete="console.log(4); ... />
</xx:compostiteComponentName>

3 - 您可能希望删除selectOneMenu上的ajax事件,因为当您在复合上指定ajax行为时,它会附加到目标组件,它不会替换现有组件,这意味着离开那个方向听众将被召唤两次。