PrimeFaces で可能な名前付けコンテナーは何ですか? を使用してフォーム上の一部の UI コントロールを更新する場合、Ajax 更新呼び出しにネーミング コンテナー ID を追加する必要があるのはなぜupdate=":mainForm:MainAccordian:userNameTextbox"
ですか?
3 に答える
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を更新します
IntelliJ ですべての JAR をスキャンして実装を調べた後、次のjavax.faces.component.NamingContainer
ことがわかりました。
PrimeFaces 5.3 から
- アコーディオンパネル
- カルーセル
- コラム
- データグリッド
- データリスト
- データスクローラー
- データ表
- ページ
- 指輪
- サブテーブル
- サブビュー
- タブビュー
- ツリーテーブル
- UIData
- UITabPanel
MyFaces 2.1 から
- HtmlDataTable
- Htmlフォーム
- UITree
- UIフォーム
Prime Faces でコンテナに名前を付ける
JSFリファレンスでわかるように
NamingContainer は、ネーミング コンテナーになりたい UIComponent によって実装する必要があるインターフェイスです。コンテナの命名は、UIComponent.findComponent(java.lang.String) および UIComponent.getClientId() メソッドの動作に影響します。
したがって、PF でネーミング コンテナーを見つけるには、NamingContainer
インターフェイスの階層を確認する必要があります。Eclipse では、たとえばCtrl+Tショートカット on でこれを行うことができますNamingContainer
。
PF 5.3 には、たとえばAccordionPanel
、Carousel
、Columns
、DataGrid
、DataList
、DataScroller
、DataTable
、Ring
、SubTable
、TabView
がTree
ありTreeTable
ます。
コンポーネント ID に対する名前付けコンテナーの影響
- デフォルトの動作
ネーミング コンテナは、その子コンポーネントのネーミング スコープを提供します。したがって、常に彼の子供の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」のようになります。
- コンポーネント名のセパレーターを変更する (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>
- UIForm属性「prependId」
子コンポーネントにスコープを追加しないようにするために、属性があります (UIForm コンポーネントのみ)。しかし、これは推奨される解決策ではありません。たとえば、 uiform-with-prependid-false-breaks-fajax-render を見てください。
コンポーネント ID の使用法 (「更新」、「プロセス」など)
- ID全体
ID 全体を使用できます: "componentParent:component"。これはお勧めできません (コードは壊れやすくなります。ID を変更すると、多くの場所で ID を変更する必要が生じます)。
- 同じレベルのネーミング コンテナー内の相対 ID
1 つの名前付けコンテナー内では、単純なコンポーネント ID を使用できます。
- 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)"
かなり強力なツールです。