下面的代码片段代表一个编辑器。在我的应用程序中,窗口在选项卡面板中显示一组编辑器,每个选项卡包含一个数据表,其中编辑器为行。选择节点后,其文本将显示在 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 的表单中,其中prependId =&#34; false&#34;
答案 0 :(得分:1)
如果组件位于不同的NamingContainer中,并且那些组件未嵌套**,则必须使用绝对客户端ID。
在您的情况下,如果您在开头不使用分隔符,findComponent算法将搜索,直到找到NamingContainer:这将是您的p:tree
。然后它会尝试在p:tree
中找到组件,因为它不在那里,你提到的异常就会抛出。
另一方面,如果执行在开头使用分隔符,则必须使用绝对客户端ID。
简短回答:不会。除非您更改组件的组织方式,否则无法使用绝对客户端ID更新 organizationUnit 。
**如果NamingContainers是嵌套的, outter NamingContainer中的组件可以通过在他们想要的实际组件的id之前引用他们的id来更新内部 NamingContainer中的组件。更新,例如:update="innerContainer1Id:componentId"
,甚至update="innerContainer1Id:innerContainer2:componentId"
。
答案 1 :(得分:0)
我用来避免引用id的常见'技巧'是使用绑定。
示例:
<h:form>
<p:button binding="#{button}" ...
</h:form>
....
<p:button update=":#{button.clientId}" ...
注意:这对于某些不生成ID的h:outputText
标记不起作用。