0

このXHTMLコードに相当するものを見つけようとしています:

<h:selectBooleanCheckbox value="#{sandboxBean.selected}" >
  <f:ajax listener="#{sandboxBean.handleToggle}" render="outputText" />
</h:selectBooleanCheckbox>

<br /><br />
<h:outputText value="#{sandboxBean.selected}" id="outputText"/>

バッキング Bean によってチェックボックス全体を動的に作成する必要がある場合。このコードで Ajax の良さを得ることができました

checkbox = new HtmlSelectBooleanCheckbox();
checkbox.setId(makeCheckboxId());

AjaxBehavior valueChangeAction = (AjaxBehavior)FacesContext.getCurrentInstance().getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);

valueChangeAction.addAjaxBehaviorListener(new AjaxBehaviorListener() {

  @Override
  public void processAjaxBehavior(AjaxBehaviorEvent event) throws AbortProcessingException {
    System.out.println("Ajax behavior called");     
  }
});

checkbox.addClientBehavior("valueChange", valueChangeAction);

しかし、メソッドを実行するための Ajax 呼び出しを取得する方法も、レンダリングしたい要素handleToggleに簡単にアクセスする方法もわかりません(この簡略化された例)。outputText

また、これは予想外に複雑に思えます。これはすべて、不明な数の列を持つテーブルが必要であることが原因です。テーブル全体をコードで作成することで、根本的に間違った角度からこれにアプローチしているだけでしょうか?

4

1 に答える 1

1

しかし、Ajax 呼び出しで handleToggle メソッドを実行する方法がわかりません

あなたのコードは、いくつかの環境固有の癖に敏感です。古い Mojarra 実装では、プログラムで作成された ajax 動作リスナー メソッドを実行できません。最新バージョンであることを確認するか、MyFaces を試してください。一部のコンテナー固有の EL 実装では、匿名クラスでメソッドを呼び出すことができません。最新のコンテナー バージョンを使用していることを確認するか、それをパブリック クラスに抽出します。


レンダリングしたいoutputText要素に簡単にアクセスできるようにする方法もありません(このカットダウンの例では)

AjaxBehavior#setRender()メソッドを使用してrender属性を設定します。

ajaxBehavior.setRender(Collections.singletonList("outputText"));

また、これは予想外に複雑に思えます。これはすべて、不明な数の列を持つテーブルが必要であることが原因です。テーブル全体をコードで作成することで、根本的に間違った角度からこれにアプローチしているだけでしょうか?

はい。ビュー側でそれを行うだけです。<c:forEach>コンポーネントを動的に作成するために使用でき<h:column>ます。または、たとえば PrimeFaces を取得できます<p:columns>ハッシュマップのリストに基づいて h:column を動的に生成するなども参照してください。

于 2013-02-01T11:59:27.333 に答える