web-dev-qa-db-ja.com

JSF 2.0で他のコンポーネントのクライアントIDを取得する

JSF 2.0には、別のコンポーネントのクライアントIDを見つけるための組み込みメソッドがありますか? SO=には約1000のクライアント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パスによって引き起こされた問題を追跡するために、多くの時間を費やしてきました。

19
cutchin

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

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

これでうまくいきました。これがOkであるかどうかは、このような応答を書くために知りたいです。

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(":", "\\\\:");
}

}
1
mert inan

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

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

承認されたソリューションを試すときに、JSF 1.2のソリューションを共有したいと思います。

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

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);
}

コンポーネントをバインドしているBeanはリクエストスコープでなければならないことに注意してください。そうしないと、Java.lang.IllegalStateException (duplicate Id for a component)になる可能性があります( このトピック と比較してください)。

1
david