ajax – JSF部分屏幕更新处理完整的组件树
我需要一些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> ;. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |