0

私は次のシナリオを得ました:私はいくつかのタブを取得しました (TabView は名前付けコンテナーです)。そのうちの 1 つで、ダイアログを表示する ap:inputText を取得しました (これは他の xhtml ファイルにあります)。 :inputText 、問題は p:inputText の id が不明であることです (JSF はそれにいくつかのプレフィックスを追加します)

<h:form id="hoursReportFrm">
    <p:inputText id="comment4Dialog" value="#{hoursReportBean.aComment}" 
onfocus="dlg1.show();"/>

ダイアログでこの update="hoursReportFrm:comment4Dialog" を使用できません

ATM i は、このサイトJSF の例を見ました: コンポーネント ID の操作 (id vs clientId) (2009 年から)

binding="#{lookup.components.comment4Dialog}"このように、および p:commandButton に変更したダイアログの inputtext にバインディングを追加しましたupdate="#{lookup.clientIds.comment4Dialog}"

そしてそれはうまく動作しますが、後でアクセスしたいすべてのコンポーネントをバインドする必要なしに、より良い方法を探しています...

よろしくお願いします。

4

1 に答える 1

2

正直なところ、バインディングがおそらく最も簡単な方法だと思いますが、そのような状況に陥ったとき、複合コンポーネントがバインディングよりも優れたソリューションを提供することがよくあります。状況によっては (これも完全にケースバイケースです)、複合コンポーネントを使用してこの問題を回避できます。これにより、ページの一部をクリエイティブに再利用できるため、特定の更新に手間がかからず、コードを再利用できます。

これの例は次のとおりです。

//comp:myDialog
...
<composite:interface>
  <composite:attribute name="update" />
  <!-- Other attributes -->
</composite:interface>

<composite:implementation>
  ...
  <!-- Implementation -->
  <p:commandButton update="#{cc.attrs.update}"/>
  ...
</composite:implementation>

そして、ここに使用中のコンポーネントがあるかもしれません:

//for the sake of argument 'comp' as your library
<h:form id="someForm">
  <p:inputText value="#{bean.changeMe}" id="changeMe"/>
</h:form>

<h:form id="dialog">
  <!-- dialog here -->
  <comp:myDialog update="someForm:changeMe" />
</h:form>

このビューを再利用可能なコードに分割することで、再利用がはるかに簡単になるため、フル パスを指定する負担を回避できる可能性があります。ただし、場合によっては、バインディングまたは複合コンポーネントのトスアップだと思います。再利用する場合は、新しいオブジェクト(コンポーネント)を作成して再利用します。非常に動的な環境を扱っている場合: バインドします。

私は決して専門家ではありませんが、一般的に言えば、上記のおかげで多くの困難な状況から抜け出すことができました。

EDIT:再読み込み時に、タブビューが遅延ロードされていないことを確認し、レンダリングを見てパスが正しいことを確認する必要があります(IDを調べます)。(古いバージョンの Primefaces で) 問題が発生しました。ID が ap:outputPanel 内にネストされている場合や、まれにサブビュー ID がネストされている場合があります。フルパス ':subview:form:component' を指定することによる非常に簡単な修正かもしれませんが、そうではありません。

于 2011-11-27T03:24:10.063 に答える