加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ajax – JSF部分屏幕更新处理完整的组件树

发布时间:2020-12-16 01:34:59 所属栏目:百科 来源:网络整理
导读:我需要一些JSF / PrimeFaces(3.5)的建议. 我们有一个动态表单,表单可以由表单构建器配置,后备bean是一个荣耀的HashMap,还有一些其他getter和setter(如getValueAsDate / setValueAsDate). 我们的一个字段类型允许输入数字,当离开字段时,请求附加信息,并更新表
我需要一些JSF / PrimeFaces(3.5)的建议.

我们有一个动态表单,表单可以由表单构建器配置,后备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>

最近我们添加了一个字段,允许使用PrimeFaces日期选择器组件输入java.util.Date.添加此字段后,部分更新将停止工作.

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

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

更新#1:

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

更新#2:

渲染配置字段的代码使用ui:repeat en条件ui:片段(尝试使用h:panelGroups)来呈现配置字段的特定输入元素.

<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:panelGroup和ui:片段组合2.

这可以被认为是Mojarra具体的< ui:repeat>报告为 issue 3215,固定在2.2.7,并按照 issue 3221在2.1.29中反映.简单地说,这个问题归结为:< ui:repeat>在保存自己的状态时不尊重其EditableValueHolder儿童的状态,因此基本上表现为在保存状态期间,这些孩子的呈现属性不被尊重.以下相关问答: 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&gt ;.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读