如何找到ajax更新/渲染组件的客户端ID?找不到表达式为“的组件”;"富",;引用自;酒吧;

如何找到ajax更新/渲染组件的客户端ID?找不到表达式为“的组件”;"富",;引用自;酒吧;,ajax,jsf,jsf-2,primefaces,clientid,Ajax,Jsf,Jsf 2,Primefaces,Clientid,以下代码受PrimeFaces DataGrid+DataTable教程的启发,并放入位于的中的中。这是代码的内部部分(从p:tab组件开始);外面的部分很琐碎 当我单击时,代码停止工作,并给出: 找不到从“选项卡:不稳定:选择”引用的表达式为“不稳定:显示”的组件 当我使用尝试相同的方法时,它失败了,并且出现了一个不同的基本相同的结果: 包含未知id“不稳定:显示”无法在组件上下文中找到它“选项卡:不稳定:选择” 当它发生在另一个Ajax回发过程中,并且JSF项目阶段被设置为开发,那么它将

以下代码受PrimeFaces DataGrid+DataTable教程的启发,并放入位于
中的
中。这是代码的内部部分(从
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
    :无
PrimeFaces通过新的关键字和复合表达式支持对此进行了增强:

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