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