12

PrimeFaces で可能な名前付けコンテナーは何ですか? を使用してフォーム上の一部の UI コントロールを更新する場合、Ajax 更新呼び出しにネーミング コンテナー ID を追加する必要があるのはなぜupdate=":mainForm:MainAccordian:userNameTextbox"ですか?

4

3 に答える 3

20

Primefacesで可能なネーミングコンテナは何ですか

JSFでは、ネーミングコンテナはUINamingContainerから派生します。

update = ":mainForm:MainAccordian:userNameTextbox"を使用してフォームのUIコントロールを更新するときに、Ajax更新呼び出しの名前付けコンテナーIDを追加する必要がある理由

たとえば、ページに<h:outputText value="test1" id="userNameTextbox" />別のIDを追加すると、IDが重複<h:outputText value="test2" id="userNameTextbox" />しているというエラーが表示されます。ここで、JavaDoc for UIComponent.setId(String)で調べることができます。

このUIComponentのコンポーネント識別子を設定します(存在する場合)。コンポーネント識別子は、次の構文制限に従う必要があります。長さがゼロの文字列であってはなりません。最初の文字は文字またはアンダースコア(' ')である必要があります。後続の文字は、文字、数字、アンダースコア(' ')、またはダッシュ('-')である必要があります。

..さらに、あなたにとって重要です:

指定された識別子は、 NamingContainerである最も近い祖先UIComponentの子孫であるすべてのコンポーネント(ファセットを含む)間で一意である必要があります。NamingContainerであるそのような祖先がない場合は、コンポーネントツリー全体のスコープ内にある必要があります。

同じNamingContainerの下に同じIDを持つ2つのコンポーネントを含めることができないことを意味します(NamingContainerがまったくない場合は、ツリー全体がNamingContainerとしてカウントされます)。したがって、NamingContainerを追加する必要があります。<h:form id="myNamingContainer" />

次の例を見てみましょう。

<h:outputText value="test1" id="userNameTextbox" />
<h:form id="container1">
  <h:outputText value="test2" id="userNameTextbox" />
</h:form>
<h:form id="container2">
  <h:outputText value="test3" id="userNameTextbox" />
</h:form>

..そしてuserNameTextboxを更新したい。3つあるので、どのuserNameTextboxを参照していますか?

最初の1つ?次に、 userNameTextboxを更新します

2つ目?次に、 container1:userNameTextboxを更新します

3つ目?次に、 container2:userNameTextboxを更新します

于 2012-11-24T20:07:40.223 に答える
9

IntelliJ ですべての JAR をスキャンして実装を調べた後、次のjavax.faces.component.NamingContainerことがわかりました。

PrimeFaces 5.3 から

  • アコーディオンパネル
  • カルーセル
  • コラム
  • データグリッド
  • データリスト
  • データスクローラー
  • データ表
  • ページ
  • 指輪
  • サブテーブル
  • サブビュー
  • タブビュー
  • ツリーテーブル
  • UIData
  • UITabPanel

MyFaces 2.1 から

  • HtmlDataTable
  • Htmlフォーム
  • UITree
  • UIフォーム
于 2016-05-11T21:41:17.780 に答える
2

Prime Faces でコンテナに名前を付ける

JSFリファレンスでわかるように

NamingContainer は、ネーミング コンテナーになりたい UIComponent によって実装する必要があるインターフェイスです。コンテナの命名は、UIComponent.findComponent(java.lang.String) および UIComponent.getClientId() メソッドの動作に影響します。

したがって、PF でネーミング コンテナーを見つけるには、NamingContainerインターフェイスの階層を確認する必要があります。Eclipse では、たとえばCtrl+Tショートカット on でこれを行うことができますNamingContainer

PF 5.3 には、たとえばAccordionPanelCarouselColumnsDataGridDataListDataScrollerDataTableRingSubTableTabViewTreeありTreeTableます。

コンポーネント ID に対する名前付けコンテナーの影響

  1. デフォルトの動作

ネーミング コンテナは、その子コンポーネントのネーミング スコープを提供します。したがって、常に彼の子供のIDにプレフィックスを追加します。したがって、子コンポーネントの id は:parent_component_id".concat(":").concat("component_id")です。私がJavaServer Faces 2.0 で読んだプロのヒントが 1 つあります。それは、NamingContainer をページに追加しなくても、常に JSF 自体によって自動的に追加されるということです:) この作成には特別なアルゴリズムも存在します (第 11 章: 構築カスタム UI コンポーネント -> 「複合コンポーネントの最上位コンポーネントを作成するためのルール」と呼ばれるボックス)。もちろん、id を設定しない場合は、自動的に生成されます (たとえば、j_idt234)。したがって、完全なコンポーネント ID は「j_idt123:j_idt234:j_idt345」のようになります。

  1. コンポーネント名のセパレーターを変更する (JSF 2.x 以降)

デフォルトのコンポーネント名セパレータ (":") をオーバーライドする方法があります。name を使用して context-param として web.xml で定義できますjavax.faces.SEPARATOR_CHAR。例えば:

<context-param>
    <param-name>javax.faces.SEPARATOR_CHAR</param-name>
    <param-value>-</param-value>
</context-param>
  1. UIForm属性「prependId」

子コンポーネントにスコープを追加しないようにするために、属性があります (UIForm コンポーネントのみ)。しかし、これは推奨される解決策ではありません。たとえば、 uiform-with-prependid-false-breaks-fajax-render を見てください。

コンポーネント ID の使用法 (「更新」、「プロセス」など)

  1. ID全体

ID 全体を使用できます: "componentParent:component"。これはお勧めできません (コードは壊れやすくなります。ID を変更すると、多くの場所で ID を変更する必要が生じます)。

  1. 同じレベルのネーミング コンテナー内の相対 ID

1 つの名前付けコンテナー内では、単純なコンポーネント ID を使用できます。

  1. PrimeFaces 検索式フレームワーク

この機能がわからない場合は、PrimeFaces のドキュメントを参照してください。Prime Faces は、いくつかの非常に便利なメカニズムを備えた検索式フレームワークを提供します。

キーワードで検索できます。

キーワードは、コンポーネントを参照する簡単な方法です。ID に解決されるため、ID が変更されても、参照を変更する必要はありません。コア JSF はいくつかのキーワードを提供し、PrimeFaces は複合式のサポートと共にさらに多くのキーワードを提供します。

例: @this(現在のコンポーネント)、@form(最も近い祖先のフォーム)、@namingcontainer(最も近い祖先の名前付けコンテナー) @parent、. @widgetVar(name)これらのキーワードを非常に複雑なパス (複合式) に混在させることもできます@form:@parent@this:@parent:@parent

PF が提供する 2 番目の可能性は、PrimeFaces Selector (PFS) です。

PFS は、コア ID ベースの JSF モデルの代わりに jQuery Selector API を使用して参照できるように、jQuery Selector API を JSF コンポーネント参照モデルと統合します。

たとえば、次のことができます。

  • すべてのフォーム要素を更新するupdate="@(form)"
  • すべてのデータテーブルを更新するupdate="@(.ui-datatable)"
  • 「myStyle」という名前の styleClass を持つすべてのコンポーネントを次のように更新します。update="@(.myStyle)"

かなり強力なツールです。

于 2016-08-14T23:40:15.200 に答える