0

下面的代码片段代表一个编辑器。在我的应用程序中,一个窗口在选项卡面板中显示一组编辑器,每个选项卡都包含一个数据表,其中编辑器作为行。当一个节点被选中时,它的文本将显示在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="false"的表单内

4

2 回答 2

1

当您在不同的 NamingContainers 中有组件,并且这些组件不是嵌套的**时,您必须使用绝对客户端 ID。

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

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

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


** 如果 NamingContainer 是嵌套的,则外部 NamingContainer 内的组件可能会通过在要更新的实际组件的 id 之前引用它们的 id 来更新内部update="innerContainer1Id:componentId"NamingContainer 内的组件,例如: ,甚至update="innerContainer1Id:innerContainer2:componentId"


JavaDoc 中解释了算法。

于 2012-09-13T15:22:05.757 回答
0

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

例子:

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

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

注意:这不适用于某些h:outputText不生成 id 的标签。

于 2012-09-13T16:34:23.227 回答