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>

タブパネルは、prependId="false"のフォームと呼ばれるフォーム内にあります

4

2 に答える 2

1

異なるNamingContainer内にコンポーネントがあり、それらがネストされていない場合**、絶対クライアントIDを使用する必要があります。

あなたの場合、最初に区切り文字を使用しないと、findComponentアルゴリズムは、NamingContainerが見つかるまで検索します。これがあなたのになりますp:tree。次に、内部のコンポーネントを見つけようとします。コンポーネントp:treeが存在しないため、前述の例外がスローされます。

一方、先頭に区切り文字を使用する場合は、絶対クライアントIDを使用する必要があります

簡単な回答:いいえ。コンポーネントの編成方法を変更しない限り、絶対クライアントIDを使用せずにorganizationUnitを更新することはできません。


** NamingContainersがネストされている場合、外部のNamingContainer内のコンポーネントは、更新する実際のコンポーネントのIDの前にIDを参照することで、内部のNamingContainer内のコンポーネントを更新できます。update="innerContainer1Id:componentId"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 に答える