将<p:ajax .../>
置于使用ui:include
的其他页面中的页面中时,我遇到了一个奇怪的问题。问题是在这种情况下,listener
的{{1}}被调用了一次以上!
例如,我创建了一个复合组件来渲染<p:ajax listener="someMethod"/>
组件。如下:
list-of-value
它的运行没有任何错误,并呈现这样的东西:
当用户点击按钮时,它将在模态对话框中显示值列表。之后用户选择其中一个值(他/她应该点击那个愚蠢的刷新按钮!)
然后关闭对话框并在辅助bean中调用一个select侦听器,以便在正确的bean(数据持有者bean)中设置值。
<?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.w3c.org/1999/xhtml"
xmlns:p="http://primefaces.org/ui"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface componentType="LovComponent">
<composite:attribute name="actionListener" method-signature="void openModalDialog(java.lang.String)"/>
<composite:attribute name="selectEventListener" method-signature="void selectAction(org.primefaces.event.SelectEvent)"/>
<composite:attribute name="id"/>
<composite:attribute name="update"/>
<composite:attribute name="value"/>
<composite:attribute name="style"/>
</composite:interface>
<composite:implementation>
<p:inputText id="#{cc.attrs.id}" value="#{cc.attrs.value}" style="#{cc.attrs.style}"/>
<p:commandButton immediate="true" process="@this" icon="ui-icon-search" actionListener="#{cc.attrs.actionListener}">
<p:ajax event="dialogReturn" listener="#{cc.selectEventListener}" update="#{cc.attrs.update}"/>
</p:commandButton>
</composite:implementation>
</html>
对话框中的选择按钮(带有刷新图标的按钮!)的代码:
<p:cellEditor>
<f:facet name="output">
<p:outputLabel id="casProfileAllowedCurrInfoGbiCurrencyCodeOut" value="#{casProfileAllowedCurrInfo.gbiCurrency.code}"/>
</f:facet>
<f:facet name="input">
<g:Lov id="casProfileAllowedCurrInfoGbiCurrencyCodeIn" selectEventListener="#{accountProfileController.allowedCurrenciesPageFragmentCasProfileAllowedCurrInfoSelectAction}"
value="#{casProfileAllowedCurrInfo.gbiCurrency.code}"
update=":profileDetailform:allowedCurrenciesCasProfileAllowedCurrInfoDataTable"
actionListener="#{accountProfileController.openModalDialog('CurrencyLov')}"
style="width:98%"/>
</f:facet>
</p:cellEditor>
当在独立页面中使用此组合时,在完成用户选择后,将调用selectEventListener(LOV组合的自定义属性)的方法一次。 (这是理想的行为)
现在我的问题是:
当我在使用<p:column headerText="#{label.SELECT}">
<p:commandButton icon="ui-icon-refresh" actionListener="#{currencyLovController.closeDialog(gbiCurrency)}" />
</p:column>
的另一个页面中包含的页面内使用它时,监听器被调用两次!坏消息是第二次选择的值为ui:include
!我找不到在包含的页面中使用它之间的关系,但是,我确定它有一个连接,因为当我将它包含在两级包含的页面中时,它被调用三次,所选值为{{ 1}}在第二次和第三次。
任何帮助都将不胜感激。
[更新]
我将子系统打包为null
null
,我有一个weblogic
应用程序,该应用程序在weblogic中作为应用程序部署。
我使用shared-library
,MainWeb
,Weblogic 12c
。
答案 0 :(得分:0)
最后我发现了问题!这不是因为彼此包含composites
。 Weblogic
中的部署方式正在引发问题。听起来有点奇怪,但当我停止使用Weblogic Shared-Library
部署时问题就消失了。
我设法将每个子系统部署为共享库,并将一个Main项目部署为一般用途(用户身份验证,安全性,菜单,页面模板,导航......)作为Web应用程序依赖于共享库(打包的模块化部署)。
当出现上述问题时,我开始从共享库中删除config-files(faces-config.xml,web.xml),但没有什么能解决问题。
最后,我改变了部署方式,暂时停止了共享库部署。当我将整个应用程序打包为一个部署时,问题就消失了!
我无法找出导致问题的原因,但现在至少它正在发挥作用!
希望它对其他人有所帮助。