Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何找到ajax更新/渲染组件的客户端ID?找不到从“bar”引用的表达式为“foo”的组件_Ajax_Jsf_Jsf 2_Primefaces_Clientid - Fatal编程技术网

如何找到ajax更新/渲染组件的客户端ID?找不到从“bar”引用的表达式为“foo”的组件

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

以下代码受PrimeFaces DataGrid+DataTable教程的启发,并放入驻留在中的中。下面是代码的内部部分,从p:tab组件开始;外面的部分很琐碎

当我单击时,代码停止工作并给出:

找不到表达式为“不稳定:显示”的组件,引用自选项卡:不稳定:选择

当我尝试使用相同的方法时,它失败了,不同的方法基本上是相同的:

包含未知id不稳定:显示器无法在组件选项卡的上下文中找到它:不稳定:选择

当它发生在另一个Ajax回发过程中,并且JSF项目阶段设置为开发阶段时,它将失败,并发出JavaScript警报,警告如下:

格式错误的DXML:更新期间:不稳定:未找到显示


这是怎么造成的,我该如何解决呢?

首先:据我所知,在选项卡视图中放置对话框是一种不好的做法。。。你最好把它拿出来

现在谈谈你的问题:

对不起,我花了一些时间才得到你想要实现的东西

刚才我自己在我的网络应用上做了,而且很有效

正如我之前所说的,将p:对话框放在'p:tabView'的外侧

按照最初的建议保留p:对话框:

p:commandlink应该是这样的,我所做的就是更改update属性


这同样适用于我的web应用程序,如果它对您不起作用,那么我猜您的java bean代码中有错误…

尝试更改更新=不稳定:显示到更新=显示。我相信你不能像那样在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,则可以通过UIComponentgetNamingContainer动态引用它,如下所示:

然而,由于Mojarra 2.2.5开始支持它,它只是停止验证它;因此,你将永远不会再面对上述问题中的例外;稍后计划对此进行另一个增强修复

这仅在当前MyFaces 2.2.7和PrimeFaces 5.2版本中不起作用。这种支持可能会出现在未来的版本中。同时,最好是更新迭代组件本身,或者更新父组件,以防它不呈现HTML,如

当使用PrimeFACS时,考虑搜索表达式或选择器。 允许您通过JSF组件树搜索表达式引用组件。JSF有几个内置组件:

@这是当前组件 @表格:父UIForm @全部:整个文档 @没有:没有 PrimeFaces通过新的关键字和复合表达式支持对此进行了增强:

@父组件:父组件 @namingcontainer:父UIMingContainer @widgetVarname:由给定widgetVar标识的组件 您还可以在复合表达式中混合这些关键字,例如@form:@parent、@this:@parent:@parent等

在@.someclass中,您可以通过jQuery CSS选择器语法引用组件。例如,在HTML输出中引用具有所有公共样式类的组件。当您需要引用许多组件时,这尤其有用。这只需要预先准备好
目标组件在HTML输出中的所有客户端ID都是固定的或自动生成的,这无关紧要。另请参见

我知道BalusC已经给出了一个很好的答案,但下面是我用来让容器告诉我正确的clientId的一个小技巧

删除组件上不工作的更新 将带有虚假更新的临时组件放在您尝试更新的组件中 点击页面,servlet异常错误将告诉您需要引用的正确客户端Id。 删除伪组件并将正确的clientId放入原始更新中 这里是代码示例,因为我的话可能无法最好地描述它

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

我建议您尝试我在回答中使用绑定和faces配置以及其他。。。这个假设可以解决您的信息:找不到compone…我再次尝试实施您的第二个建议,但仍然不起作用。对话框将打开,但不包含选定项的数据。日志显示在视图中找不到标识符为j_idt31的组件,除此之外,我无法调试任何组件。@jack:请阅读javadoc:自JSF 2.0以来,它已成为可配置的,而不是常量。SEPARATOR_CHAR不是不推荐使用的吗?您能否给出一个如何调用嵌套组件的示例,例如:context.getViewRoot.findComponent:inputform+UINamingContainer.getSeparatorCharcontext+inputtext;另外,请包括xhtml代码。谢谢,请注意prependId=false saved my day的表单中的ajax rerender失败。在您的解释中,客户端ID的确切含义是什么?它是否与JSF->该组件的客户端标识符相同。问候+感谢您的工作。@antonu17:如回答中所述,Mojarra的f:ajax只支持它。非常古老但有误导性的回答。请参阅上面BalusC的帖子,其中清楚地显示了组件ID的前缀和封装表单的ID:
<h:form id="form">
    <p:commandLink update=":result"> <!-- FAIL! -->
</h:form>
<h:form id="otherform">
    <h:panelGroup id="result" />
</h:form>
<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