我有这个复合组件,它完美无缺。
<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
为什么听众会停止工作?
答案 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行为时,它会附加到目标组件,它不会替换现有组件,这意味着离开那个方向听众将被召唤两次。