【问题标题】:ajax listener in composite component stops working when I add clientBehavior当我添加 clientBehavior 时,复合组件中的 ajax 侦听器停止工作
【发布时间】:2018-01-20 23:59:24
【问题描述】:

我有这个复合组件,它工作得很好。

<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>

但我想从这个组件外部收听“更改”事件。所以我在 cc:interface 中使用了“cc:clientBehavior”。出于测试目的,我添加了几个“console.out”。

首先我更新了复合组件:

<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>

问题是复合组件中的监听器停止工作。所有的“onstart”和“oncomplete”似乎都可以工作,因为控制台输出是:

1
2
3
4

为什么监听器停止工作?

【问题讨论】:

  • 如果这适用于普通的非primefaces jsf对应物(所以h:selectOneMenuf:ajax)。这样你就可以缩小范围,如果它是 PrimeFaces 相关的或普通的 jsf)

标签: ajax jsf primefaces composite-component


【解决方案1】:

1-复合组件仅针对本地组件,因此没有#{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 行为时,它会附加到目标组件并且不会替换现有组件,这意味着离开这种方式监听器将被调用两次。

【讨论】:

  • 确定是 3?您不能直接在组件 afaik 上为同一事件添加两个 ajax 处理程序(但这可能与不是两个不同的侦听器有关,不确定是否相同)
  • 可以,因为我测试了代码,并且调用了两次监听器方法。
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2021-07-08
  • 2012-09-17
  • 2011-09-21
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多