如何找到ajax更新/渲染组件的客户端ID?找不到表达式为“的组件”;"富",;引用自;酒吧;
以下代码受PrimeFaces DataGrid+DataTable教程的启发,并放入位于如何找到ajax更新/渲染组件的客户端ID?找不到表达式为“的组件”;"富",;引用自;酒吧;,ajax,jsf,jsf-2,primefaces,clientid,Ajax,Jsf,Jsf 2,Primefaces,Clientid,以下代码受PrimeFaces DataGrid+DataTable教程的启发,并放入位于的中的中。这是代码的内部部分(从p:tab组件开始);外面的部分很琐碎 当我单击时,代码停止工作,并给出: 找不到从“选项卡:不稳定:选择”引用的表达式为“不稳定:显示”的组件 当我使用尝试相同的方法时,它失败了,并且出现了一个不同的基本相同的结果: 包含未知id“不稳定:显示”无法在组件上下文中找到它“选项卡:不稳定:选择” 当它发生在另一个Ajax回发过程中,并且JSF项目阶段被设置为开发,那么它将
的
中的
中。这是代码的内部部分(从p:tab
组件开始);外面的部分很琐碎
当我单击
时,代码停止工作,并给出:
找不到从“选项卡:不稳定:选择”引用的表达式为“不稳定:显示”的组件
当我使用
尝试相同的方法时,它失败了,并且出现了一个不同的基本相同的结果:
包含未知id“不稳定:显示”无法在组件上下文中找到它“选项卡:不稳定:选择”
当它发生在另一个Ajax回发过程中,并且JSF项目阶段被设置为开发
,那么它将失败,并发出JavaScript警报,警告如下:
格式错误的DXML:更新期间:不稳定:未找到显示
这是怎么造成的,我该如何解决呢?首先:据我所知,在选项卡视图中放置对话框是一种不好的做法。。。你最好把它拿出来 现在谈谈你的问题: 对不起,我花了一些时间才得到你想要实现的东西 刚才我自己在我的网络应用上做了,而且很有效 正如我之前所说的,将p:对话框放在'p:tabView'的外侧 按照最初的建议保留p:对话框:
p:commandlink应该是这样的(我所做的只是更改update属性)
这同样适用于我的web应用程序,如果它对您不起作用,那么我猜您的java bean代码中有问题…尝试将
update=“insTable:display”
更改为update=“display”
。我相信你不能像那样在id前面加上表单id 这是因为选项卡也是一个命名容器。。。您的更新应该是update=“Search:insTable:display”
您还可以做的是将对话框放在表单外部,仍然放在选项卡内部,然后它将是:update=“Search:display”
查看HTML输出中的实际客户端ID
您需要查看生成的HTML输出以找到正确的客户端ID。在浏览器中打开页面,右键单击并查看源代码。找到感兴趣的JSF组件的HTML表示,并将其id
作为客户端id。根据当前命名容器的不同,您可以以绝对或相对方式使用它。见下一章
注意:如果它恰好包含迭代索引,如:0:
,:1:
,等等(因为它位于迭代组件内部),那么您需要意识到并不总是支持更新特定的迭代轮。关于这方面的更多细节,请参见答案的底部
记住NamingContainer
组件,并始终给它们一个固定的ID
如果您希望通过ajax进程/执行/更新/渲染引用的组件位于同一父级内部,那么只需引用它自己的ID即可
<h:form id="form">
<p:commandLink update="result"> <!-- OK! -->
<h:panelGroup id="result" />
</h:form>
的生成HTML输出如下所示:
<table id="tabs:insTable:display">
引用外部include/tagfile/composite
如果此命令链接位于include/tagfile内部,而目标位于该文件外部,因此您不一定知道当前命名容器的命名容器父级的ID,那么您可以通过UIComponent\getNamingContainer()
动态引用它,如下所示:
<p:commandLink update=":#{component.namingContainer.parent.namingContainer.clientId}:display">
<h:form id="form">
<ui:repeat id="list" value="#{['one','two','three']}" var="item">
<h:outputText id="item" value="#{item}" /><br/>
</ui:repeat>
<h:commandButton value="Update second item">
<f:ajax render=":form:list:1:item" />
</h:commandButton>
</h:form>
然而,自从Mojarra 2.2.5以来,
开始支持它(它只是停止验证它;因此,您将永远不会再面对所提到的异常问题;稍后计划对此进行另一个增强修复)
这仅在当前MyFaces 2.2.7和PrimeFaces 5.2版本中不起作用。这种支持可能会出现在未来的版本中。同时,最好的办法是更新迭代组件本身,或者更新父组件,以防它不呈现HTML,如
当使用PrimeFACS时,考虑搜索表达式或选择器。
允许您通过JSF组件树搜索表达式引用组件。JSF有几个内置组件:
:当前组件@此
:父级@form
UIForm
:整个文档@all
:无@none
:父组件@parent
:父级@namingcontainer
UINamingContainer
:由给定的@widgetVar(名称)
widgetVar
@form:@parent
,@this:@parent:@parent
,等等
与
@(.someclass)
一样,它允许您通过jQuery CSS选择器语法引用组件。例如,在HTML输出中引用具有所有公共样式类的组件。当您需要引用“很多”组件时,这尤其有用。这只要求目标组件在HTML输出中具有所有客户端ID(固定或自动生成,无所谓)。另请参见我知道BalusC已经给出了一个很好的答案,但是这里有一个小技巧,我可以让容器告诉我正确的clientId
<h:form id="form">
<p:commandLink update=":otherform:result"> <!-- OK! -->
</h:form>
<h:form id="otherform">
<h:panelGroup id="result" />
</h:form>
<p:tabView id="tabs"><!-- This is a NamingContainer -->
<p:tab id="search"><!-- This is NOT a NamingContainer -->
<h:form id="insTable"><!-- This is a NamingContainer -->
<p:dialog id="dlg"><!-- This is NOT a NamingContainer -->
<h:panelGrid id="display">
<table id="tabs:insTable:display">
<p:commandLink update=":#{component.namingContainer.parent.namingContainer.clientId}:display">
<p:commandLink update=":#{cc.parent.namingContainer.clientId}:display">
<p:commandLink update=":#{cc.clientId}:display">
<h:form id="form">
<ui:repeat id="list" value="#{['one','two','three']}" var="item">
<h:outputText id="item" value="#{item}" /><br/>
</ui:repeat>
<h:commandButton value="Update second item">
<f:ajax render=":form:list:1:item" />
</h:commandButton>
</h:form>
<p:tabView id="tabs">
<p:tab id="search" title="Search">
<h:form id="insTable">
<p:dataTable id="table" var="lndInstrument" value="#{instrumentBean.instruments}">
<p:column>
<p:commandLink id="select"
oncomplete="dlg.show()">
<f:setPropertyActionListener value="#{lndInstrument}"
target="#{instrumentBean.selectedInstrument}" />
<h:outputText value="#{lndInstrument.name}" />
</p:commandLink>
</p:column>
</p:dataTable>
<p:dialog id="dlg" modal="true" widgetVar="dlg">
<h:panelGrid id="display">
<p:commandButton id="BogusButton" update="BogusUpdate"></p:commandButton>
<h:outputText value="Name:" />
<h:outputText value="#{instrumentBean.selectedInstrument.name}" />
</h:panelGrid>
</p:dialog>
</h:form>
</p:tab>
</p:tabView>
tabs:insTable:display