我有一个带有PrimeFaces selectOneMenu的表单,当用户选择一个选项时,我想以相同的形式刷新具有不同数据的DataTable。当我选择一个选项时,我会得到一个Javascript弹出窗口,上面写着&#34; malformedXML:更新期间:outerTab:找不到j_idt185&#34;没有DataTable刷新和检查源我在页面底部看到一个不可见的iframe,id =&#34; JSFFrameId&#34;其中包含元素<partial-response>
,而元素<update id="outerTab:j_idt185" ...>
又包含元素<![CDATA[<div id="outerTab:j_idt185" class="ui-messages ui-widget" aria-live="polite"></div>]]>
,其中包含元素<messages>
。我认为这引用了我的<div id="outerTab:facilitatorTestsForm:j_idt113" class="ui-messages ui-widget" aria-live="polite"></div>
标记,但是支持bean中没有任何内容创建消息,我确实在页面源<div align="center">
<h:form id="facilitatorTestsForm">
<p:messages for="testBeanMessages" showSummary="true" showDetail="true" globalOnly="true" escape="false" autoUpdate="true" />
Tests for which event?
<p:selectOneMenu value="#{testBean.selectedEventId}" style="top: 7px; ">
<f:selectItem itemLabel="All Tests" itemValue="" />
<f:selectItems value="#{testBean.facilitatorEvents}" var="event" itemValue="#{event.id}" itemLabel="#{event.name}" />
<f:ajax update="facilitatorTests" />
</p:selectOneMenu>
<p:commandButton value="Add a New Test" style="margin: 20px;" oncomplete="PF('newTestDialog').show();" actionListener="#{testBean.createEmptyNewTest}" immediate="true" />
<p:dataTable var="test" value="#{testBean.testsForFacilitator}" rowIndexVar="index" id="facilitatorTests" widgetVar="facilitatorTests" selectionMode="single" selection="#{testBean.selectedTest}" rowKey="#{test.id}">
<p:ajax event="rowSelect" oncomplete="PF('facilitatorEditTestDialog').show(); " update="@form:facilitatorEditTestDialog" />
<p:column>#{index + 1}</p:column>
<p:column headerText="Test" sortBy="#{test.name}" width="40%"><h:outputText value="#{test.name}" /></p:column>
<p:column headerText="Tester" sortBy="#{test.tester.fullname}"><h:outputText value="#{test.tester.fullname}" /></p:column>
<p:column headerText="Manager" sortBy="#{test.manager.fullname}"><h:outputText value="#{test.manager.fullname}" /></p:column>
<p:column headerText="Event" sortBy="#{test.event.name}"><h:outputText value="#{test.event.name}" /></p:column>
<p:column headerText="Functional Area" sortBy="#{test.functionalArea.name}"><h:outputText value="#{test.functionalArea.name}" /></p:column>
<p:column headerText="Complete" width="150" sortBy="#{test.completionDate}"><h:outputText value="#{test.completionDate == null ? 'Not Completed' : test.completionDate}"><f:convertDateTime pattern="M/d/yyyy hh:mm a" /></h:outputText></p:column>
<p:column id="delete" style="text-align: center; vertical-align: middle; min-width: 54px; ">
<p:commandButton update="facilitatorTests" process="facilitatorTests" icon="ui-icon-close" actionListener="#{testBean.deleteTest(test.id)}"
title="If the test has not been completed, it will be deleted permanently. Otherwise it will be archived."/>
</p:column>
</p:dataTable>
<... a few dialogs with conditional rendering ...>
</h:form>
</div>
中看到了消息所在的元素,因此消息标记确实已呈现。我找不到包含&#34; j_idt185&#34;的ID的元素。并且显然两个Javascript都没有。
&#34; outerTab&#34;在ID中是PrimeFaces TabView,其中包含所有这些内容。
页面刷新会导致更新发生,DataTable会显示所选SelectOneMenu选项的正确数据。
我在balusC中找到了几个帖子,其中一些由ajax调用更新的元素具有渲染值,使得它不能渲染,因此在调用更新时无法找到。我的更新目标(DataTable)没有渲染属性,并且始终可见,因此这是一个不同的问题。其他帖子讲的是早期版本的PrimeFaces中的一个错误(我使用的是6.1)。我无法弄清楚为什么会出现这种错误。
以下是我的网页摘录:
versionCode
我为selectOneMenu更新属性尝试了不同的目标,但它没有改变行为,所以我认为它是正确的。
Primefaces 6.1
Mojarra JSF API&amp; IMPL 2.2.4
EL 3.0.0
Tomcat 7
这是一个JSF错误吗?感谢您提供的任何帮助。
答案 0 :(得分:0)
找到解决方案。感谢@Kukeltje留在我身边,即使他因为没有足够的信息而向我提出问题:)
回到@BalusC的帖子,关于不呈现ajax更新的目标。在这种情况下,我有几个PrimeFaces TabView选项卡包含带有<p:messages>
的{{1}}标签,并且根据用户的角色显示/隐藏选项卡。当我从这些消息标记中删除autoUpdate="true"
时,问题就消失了。显然每次我做一个ajax帖子,即使我有部分提交仅限于当前可见选项卡的渲染子元素,autoUpdate="true"
会导致JSF尝试更新未渲染选项卡中的消息标签,当然它们无法找到
我发现这个的方法是将id属性放在我的表单中的每个元素上。然后,Javascript错误将我指向一个命名(id&#39; d)元素,而不是一个具有我无法跟踪的自动分配ID的元素,当我看到&#34; autoUpdate&#34;灯泡亮了。道德:把艾滋病放在一切。
我希望这可以帮助有相同症状的人到处寻找autoUpdate。
而@Kukeltje你是对的,我的帖子信息不充分 - 如果没有带有渲染属性的封闭标签,你就不会看到问题。因为他们在另一个模板autoUpdate
的形式我不认为它们是相关的。 Wrongo!