gpt4 book ai didi

ajax - JSF Partial Screen Update 处理完整的组件树

转载 作者:行者123 更新时间:2023-12-03 23:53:10 26 4
gpt4 key购买 nike

我需要一些 JSF/PrimeFaces (3.5) 建议。

我们有一个动态表单,表单可以通过表单构建器进行配置,backing bean 是一个荣耀的HashMap带有一些额外的 getter 和 setter,例如 ( getValueAsDate/setValueAsDate )。

我们的一种字段类型允许输入数字,并在离开该字段时请求附加信息并更新表单的一部分。这似乎一切正常。

<h:panelGroup id="clientInfo" layout="block" rendered="#{field.type == 'CLIENTINFO'}">
<h:outputLabel for="inputClientId">#{field.label}</h:outputLabel>
<p:inputText id="inputClientId" maxlength="9" value="#{handler.property(field.id).value}">
<p:ajax listener="#{handler.fetchClientDetails(field.id)}" partialSubmit="true" process="@this" update="@parent,:mainform:msgs"
</p:inputText>
<!-- Additional output text elements to display the name, address etc. -->
</h:panelGroup>

最近我们添加了一个允许输入 java.util.Date 的字段。使用 PrimeFaces 日期选择器组件。添加此字段类型后,部分更新停止工作。
<h:panelGroup id="date" layout="block" rendered="#{field.type == 'DATE'}">
<h:outputLabel for="inputDate">#{field.label}</h:outputLabel>
<p:calendar id="inputDate" value="#{handler.property(field.id).valueAsDate}" pattern="dd-MM-yyyy" maxlength="10">
<f:convertDateTime pattern="dd-MM-yyyy" />
</p:calendar>
</h:panelGroup>

当检查来自服务器的部分结果时,我们得到如下内容(其中 12345 是在上面的字段中输入的 clientId)。
<partial-response>
<error>
<error-name>class java.text.ParseException</error-name>
<error-message><![CDATA[Unparseable date: "12345"]]></error-message>
</error>
</partial-response>

问题基本上是为什么它甚至调用 getValueAsDate不是 Date 的字段的方法或者当屏幕上甚至没有日期字段类型时?这可能是我对 JSF 生命周期或部分更新在 JSF/PrimeFaces 中的工作方式的遗漏(或误解)。

更新 #1:

刚刚在另一个调试 session 中注意到这不仅发生在部分更新中,而且在最初渲染屏幕时已经发生。看起来好像所有 EL 表达式都一直被评估,这也会导致我的支持对象中的其他属性(当一个属性被请求但它不存在时,它会用值 null 创建)。

更新#2:

呈现配置字段的代码使用 ui:repeat en 条件 ui:fragment s(也尝试过 h:panelGroup s)来呈现配置字段的特定输入元素。
<ui:repeat value=#{handler.formFields} var="field">
<ui:fragment rendered="field.type == 'DATE'>
<!-- Specific fragment for date field -->
</ui:fragment>
<ui:fragment rendered="field.type == 'TEXT'>
</ui:fragment>
<ui:fragment rendered="field.type == 'REGEXP'>
</ui:fragment>
<ui:fragment rendered="field.type == 'CLIENT'>
</ui:fragment>
</ui:repeat>

两个都试了 h:panelGroupui:fragments 2的组合。

最佳答案

这是可识别为 Mojarra 特定的 <ui:repeat>被报告为 issue 3215 的错误,根据 issue 3221 在 2.2.7 中修复并在 2.1.29 中向后移植.简单地说,问题归结为<ui:repeat>不尊重其状态 EditableValueHolder children 在保存自己的状态时,这里基本上表现得好像rendered在国家储蓄期间,这些 child 的属性从未得到尊重。以下相关问答详细说明了其他后果之一:PropertyNotFoundException on conditionally rendered subclasses in ui:repeat .

鉴于您使用的是 Mojarra 2.1.x,最好的办法是升级到至少 2.1.29。如果您的环境允许(Servlet 3.0 等),也应该可以升级到最新的 2.2.x。

替代方案是用 MyFaces 替换 Mojarra,或替换 <ui:repeat><ui:fragment>来自 <c:forEach><c:if> .

关于ajax - JSF Partial Screen Update 处理完整的组件树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29818057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com