19

JSF 2.0 には、別のコンポーネントのクライアント ID を見つけるための組み込みメソッドがありますか? SO には約 1,000 件のクライアント ID 関連の質問があり、これを行うためのハックな方法がたくさんありますが、JSF 2.0 が私が知らないより単純な方法をもたらしたのではないかと思っています。

#{component.clientId}特定のコンポーネントの独自のクライアント ID に評価されますが、別のコンポーネントの ID を参照したいと考えています。

このブログ投稿では について言及しており、動作component.clientIdするとも述べて#{someComponent.clientId}いますが、私が知る限り、そうではありません。彼は、JSF 2.0 のリファレンス実装が公開される前に、JSR を使用しただけで、機能が変更された可能性があると書いていたと思います。わからない。

PrimeFaces と RichFaces の両方にクライアント ID を返す独自の関数があることは知っていますが、このための組み込みの JSF 2.0 メソッドがあるかどうか疑問に思っています。ここではいくつかの例を示します。

これは、outputText の ID を返すように機能します。

`<h:outputText value="My client ID : #{component.clientId}" />`

上記のブログ投稿によると、これは機能するはずですが、機能しません。出力が得られません。

`<h:button id="sampleButton" value="Sample" />`

`<h:outputText value="sampleButton's client ID : #{sampleButton.clientId}" />`

これは PrimeFaces で機能します。

`<h:outputText value="PrimeFaces : sampleButton's client ID : #{p:component('sampleButton')}" />` 

RichFaces で動作:

`<h:outputText value="RichFaces : sampleButton's client ID : #{rich:clientId('sampleButton')}" />`

javax.faces.SEPARATOR_CHARまた、可能な限り、値を変更したり、参照されているコンポーネントの外側にコンテナーを追加/削除したりしても壊れないソリューションを探しています。ハードコーディングされた ID パスが原因で発生する問題を追跡するのに多くの時間を費やしました。

4

3 に答える 3

35

属性ごとにビュー スコープ内の変数名をコンポーネントに割り当てる必要がありbindingます。

<h:button id="sampleButton" binding="#{sampleButton}" value="Sample" />
<h:outputText value="sampleButton's client ID : #{sampleButton.clientId}" />
于 2012-08-26T01:32:48.093 に答える
1

これは私のグーグル検索の最初の結果の1つであり、なぜ私が得たのか疑問に思ったので

javax.el.PropertyNotFoundException (プロパティ 'itemId' が見つかりません [...])

受け入れられたソリューションを試すとき、JSF 1.2 のソリューションを共有したいと思います。

UIComponentメソッドにはパラメーターgetClientIdが必要です ( UIComponent のドキュメントを参照してください)。したがって、バッキング Bean にバインディングを追加し、clientId を返す別のメソッドも追加します。FacesContext

xhtml:

<h:button id="sampleButton" binding="#{backingBean.sampleButton}" value="Sample" />
<h:outputText value="sampleButton's client ID : #{backingBean.sampleButtonClientId}" />

豆:

private UIComponent sampleButton;

public UIComponent getSampleButton() {
    return sampleButton;
}

public void setSampleButton(final UIComponent sampleButton) {
    this.sampleButton = sampleButton;
}

public String getSampleButtonClientId() {
    final FacesContext context = FacesContext.getCurrentInstance();
    return sampleButton.getClientId(context);
}

java.lang.IllegalStateException (duplicate Id for a component)コンポーネントをバインドしいる Bean はリクエスト スコープである必要があることに注意してください。

于 2014-01-22T12:54:01.800 に答える
1

これは私にとってはうまくいきました。ただし、このような応答を書いてもよいかどうか知りたいです。

client.html

<h:outputText value="#{UIHelper.clientId('look-up-address-panel-id')}" />

UIHelper.java

@ManagedBean(name = "UIHelper", eager = true)
@ApplicationScoped
public class UIHelper
{

public String clientId(final String id)
{
  FacesContext context = FacesContext.getCurrentInstance();
  UIViewRoot root = context.getViewRoot();
  final UIComponent[] found = new UIComponent[1];
  root.visitTree(new FullVisitContext(context), new VisitCallback()
  {
    @Override
    public VisitResult visit(VisitContext context, UIComponent component)
    {
      if (component.getId().equals(id))
      {
        found[0] = component;
        return VisitResult.COMPLETE;
      }
      return VisitResult.ACCEPT;
    }
  });
  return found[0] == null ? "" : "#" + found[0].getClientId().replace(":", "\\\\:");
}

}
于 2013-11-14T18:04:54.737 に答える