Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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
Java 在不指定绝对客户端id的情况下更新组件_Java_Jsf_Primefaces - Fatal编程技术网

Java 在不指定绝对客户端id的情况下更新组件

Java 在不指定绝对客户端id的情况下更新组件,java,jsf,primefaces,Java,Jsf,Primefaces,下面的代码片段表示一个编辑器。在我的应用程序中,windows在选项卡面板中显示一组编辑器,每个选项卡包含一个datatable,编辑器作为行。选择节点后,其文本将显示在organizationUnit输入文本中。编辑不应该知道它的父母。是否可以在不使用绝对客户端id的情况下更新organizationUnit <p:tabView value="#{accountsBean.groups}" var="group"> <p:tab title="#{eval.getS

下面的代码片段表示一个编辑器。在我的应用程序中,windows在选项卡面板中显示一组编辑器,每个选项卡包含一个datatable,编辑器作为行。选择节点后,其文本将显示在organizationUnit输入文本中。编辑不应该知道它的父母。是否可以在不使用绝对客户端id的情况下更新organizationUnit

<p:tabView value="#{accountsBean.groups}" var="group">
    <p:tab title="#{eval.getString(group.name)}">
        <p:dataTable value="#{group.editors}"
            var="editor">                       
            <p:column>
                 <custom:include src="#{editor.component}">
                     <ui:param name="bean" value="#{editor.beanName}"/>
                     <ui:param name="mandatory" value="#{editor.mandatory}"/>
                     <ui:param name="name" value="#{editor.name}"/>
                 </custom:include>
            </p:column>
        </p:dataTable>
    </p:tab>                        
</p:tabView>

<h:panelGrid id="containerEditor" columns="2">
    <h:outputText value="#{name}: #{mandatory ? '*' : ''}" />
    <p:tree value="#{bean.root}" var="node" selectionMode="single" selection="#
        {selectedNode}">
        <p:ajax event="select" listener="#{bean.onNodeSelect}"
            update="update_organization_unit" immediate="true" />
        <p:treeNode>
            <h:outputText value="#{node}" />
        </p:treeNode>
    </p:tree>
    <h:outputText />
    <p:inputText id="organizationUnit" value="#{bean.selectedItemPath}"
        disabled="true" />
</h:panelGrid>


选项卡面板位于一个名为form with prependId=“false”

的表单中。如果在不同的命名容器中有组件,并且这些组件没有嵌套**,则必须使用绝对客户端id

在您的情况下,如果在开始时不使用分隔符,findComponent算法将一直搜索,直到找到NamingContainer:这将是您的
p:tree
。然后它会尝试在
p:tree
中查找组件,因为它不在那里,所以会抛出您提到的异常

另一方面,如果在开头使用分隔符,则必须使用绝对客户端id

简短回答:否。除非更改组件的组织方式,否则在不使用绝对客户端id的情况下无法更新organizationUnit


**如果NamingContainers是嵌套的,则outter NamingContainer中的组件可以通过在要更新的实际组件id之前引用其id来更新内部NamingContainer中的组件,例如:
update=“innerContainer1Id:componentId”
,甚至
update=“innerContainer1Id:innerContainer2:componentId”



我用来避免引用ID的一个常见“技巧”是使用绑定

例如:

<h:form>
    <p:button binding="#{button}" ...
</h:form>

....
<p:button update=":#{button.clientId}" ...


我很难理解您的问题,是什么阻止您使用
update=“organizationUnit”
?您还应该明确代码的下半部分是某种组件,并发布定制的完整代码:include@RasmusFranke我理解这个问题,它确实与代码有关。他不能这样做,因为
在不同的NamingContainer中。ajax事件在inputText的命名容器中的命名容器中。如果id在当前容器中不存在,我认为JSF会在父容器中查找。如果我在更新语句中使用organizationUnit,我会得到这个结果严重:javax.faces.FacesException:找不到标识符为“organizationUnit”的组件,该标识符引用自“j_idt85:0:j_idt88:4:j_idt903:j_id647446661_47d7f77b:j_idt2”.ajax事件位于p:treeTable内部,p:treeTable是一个命名容器,输入文本将datatable作为命名容器。