web-dev-qa-db-ja.com

追加パラメーターをAjaxイベントリスナーに送信する

アイテムビューページにリダイレクトするajaxリスナーがあります。ただし、モデルとしてジェネリック型を使用しているため、追加の共通データテーブルコントローラーで、2番目のパラメーターを持つビューを指定します。

残念なことに、オブジェクトの識別に役立つeventパラメータを使用する2つのリスナーアプローチのいずれかを選択できます。2つ目はfree paramを送信する機会を提供しますが、イベントがありません。

テンプレート

<p:dataTable value="#{aObj.objList}" var="item" .... selectionMode="single">

  <p:ajax event="rowSelect" listener="#{aObj.viewItem}" />
  <p:ajax event="rowSelect" listener="#{aObj.viewItem('myItemView?_id=')}" />

  ...
</p:dataTable>

コントローラー

public void viewItem(SelectEvent event) {
  // ...
}

public void viewItem(String viewUrl) {
  // ...
}

Beanに追加のプロパティを追加することはできますが、それは汎用的であり、モデルアイテムを提供することはそれを汚染するのに適切ではないと感じます。

回避策はありますか?

9
kidwon

データテーブルに属性を設定し、それを選択リスナーで読み取ることができます。そのためには、_<f:attribute name="..." value="..."/>_を使用します。 ドキュメント から:

制約

UIComponentカスタムアクション内にネストする必要があります。

説明文

最も近い親UIComponentカスタムアクションインスタンス(...)を見つけます。関連するコンポーネントにその名前のコンポーネント属性がすでにある場合は、何もしないでください。それ以外の場合は、引数valueisLiteralText()メソッドを呼び出します。 trueが返された場合は、コンポーネントの属性Mapに、上記で導出された名前で値を格納します。 falseが返された場合は、ValueExpressionをコンポーネントのValueExpressionマップに上記の名前で保存します。

したがって、コメントで設定しようとした属性を使用して、次のように使用する必要があります。

XHTML:

_<p:dataTable value="#{aObj.objList}" var="item" .... selectionMode="single">

  <f:attribute name="test" value="abc" />
  <p:ajax event="rowSelect" listener="#{aObj.viewItem}" />

  ...
</p:dataTable>
_

リスナー:

_public void viewItem(SelectEvent event) {
  String test = (String) event.getComponent().getAttributes().get("test");
  // ...
}
_
22
Jasper de Vries

Ajaxタグに固有の要求パラメーターを追加する場合は、onstartメソッドで実行できます。

<p:ajax onstart="cfg.ext.params.Push({name: 'name', value: 'value'});"/>

通常、モデルを使用してパラメーターを解決する必要があります。

2
Tires