JSF组合组件和ajax事件,使用内部和嵌套ajax侦听器
我试图创建一个复合组件,允许用户输入日期(通过primefaces日历组件)和/或整数(通过primefaces inputnumber组件),表示参考日期和用户输入日期之间的间隔(以天为单位)。 要链接的日历和inputNumber组件,当其他组件发生更改时,应呈现每一个组件 下面是它的样子: 问题似乎是嵌套的p:ajax接管了同一事件的内部p:ajax。这是正常的行为吗?有没有一种方法可以让一个事件有两个监听器,一个在复合组件内部,一个在必要时嵌套 InputDateCart.xhtml-组件及其内部组件的定义JSF组合组件和ajax事件,使用内部和嵌套ajax侦听器,ajax,jakarta-ee,jsf-2.2,composite-component,java-ee-8,Ajax,Jakarta Ee,Jsf 2.2,Composite Component,Java Ee 8,我试图创建一个复合组件,允许用户输入日期(通过primefaces日历组件)和/或整数(通过primefaces inputnumber组件),表示参考日期和用户输入日期之间的间隔(以天为单位)。 要链接的日历和inputNumber组件,当其他组件发生更改时,应呈现每一个组件 下面是它的样子: 问题似乎是嵌套的p:ajax接管了同一事件的内部p:ajax。这是正常的行为吗?有没有一种方法可以让一个事件有两个监听器,一个在复合组件内部,一个在必要时嵌套 InputDateCart.xhtml-
之后
index.xhtml-复合组件及其嵌套
现在:-
下一步:
您可以在这里找到一个最小的工作示例
运行mwe时,您会发现嵌套的p:ajax捕获了“change”事件,从而阻止了内部p:ajax的执行及其对cc.updateDate或cc.updateInterval的调用。但不会捕获dateSelect并更新间隔
实际上,我还有第二个问题,我还没有尽力解决它,但是如果你有答案,我会接受它:在index.xhtml中,这一行
似乎没有更新支持bean中的值{index.next}
,我是不是误报了什么
非常感谢
<ui:component xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:cc="http://xmlns.jcp.org/jsf/composite">
<cc:interface componentType="inputDateEcart">
<cc:attribute name="value" type="java.time.LocalDate" shortDescription="Selected date" required="true" />
<cc:attribute name="reference" type="java.time.LocalDate" shortDescription="Reference date" required="true" />
<cc:attribute name="disabled" type="java.lang.Boolean" />
<cc:attribute name="style" type="java.lang.String" />
<cc:attribute name="styleClass" type="java.lang.String" />
<cc:clientBehavior name="change" default="true" targets="interval date" event="change" />
</cc:interface>
<cc:implementation>
<div id="#{cc.clientId}" style="#{cc.attrs.style}" class="ui-inputgroup #{cc.attrs.styleClass}">
<span class="ui-inputgroup-addon">After</span>
<p:inputNumber id="interval"
binding="#{cc.interval}"
decimalPlaces="0"
disabled="#{cc.attrs.disabled}"
required="#{cc.attrs.required}"
style="max-width: 50px;">
<p:ajax process="@this" update="date, weekDay" listener="#{cc.updateDate}" />
</p:inputNumber>
<h:outputText id="weekDay" binding="#{cc.weekDay}" styleClass="ui-inputgroup-addon" style="text-align: start"/>
<p:calendar id="date"
binding="#{cc.date}"
navigator="true"
mindate="#{cc.attrs.reference}"
disabled="#{cc.attrs.disabled}"
required="#{cc.attrs.required}">
<p:ajax process="@this" update="interval, weekDay" listener="#{cc.updateInterval}" />
<p:ajax event="dateSelect" process="@this" update="interval, weekDay" listener="#{cc.updateInterval}" />
</p:calendar>
</div>
</cc:implementation>
</ui:component>
<h:form id="intervalForm">
<p:outputLabel for="next" label="Next date" />
<cc:inputDateEcart id="next"
value="#{index.next}"
reference="#{index.date}">
<p:ajax process="@this" update="intervalForm:test" />
</cc:inputDateEcart>
<p:outputPanel id="test" styleClass="test" style="margin-top: 15px">
Now : <h:outputText value="#{index.now}" style="font-weight: bold" /> -
Next : <h:outputText value="#{index.next}" style="font-weight: bold" />
</p:outputPanel>
</h:form>