1

レンダラーを拡張して、 rich:dataTableにいくつかの機能を追加しようとしています。より具体的には、(バッキング Bean でアクションをトリガーするために) ajax 呼び出しをトリガーするヘッダー列にリンクをレンダリングしたいと思います。

そこで、最初に考えたのは、dataTable のレンダラーを変更してインスタンス化し、a4j:commandLinkインスタンスを追加することでした。それはある程度機能し、リンクは問題なくレンダリングされますが、関連するアクションは呼び出されず、追加されたパラメーター割り当ては実行されません。さらに、ビューのどの部分が実行およびレンダリングされているかを実際に確認することはできません。設定した値が無視されているようです (たとえば、これらの 2 つのプロパティの値として@allを指定すると、私のページのごく一部)。

これは、リンクを作成するために使用するコードです。

UICommandLink l = (UICommandLink) context.getApplication().createComponent(UICommandLink.COMPONENT_TYPE);
l.setTransient(false);
l.setRender("@all");
l.setExecute("@all");
l.setActionExpression(ULHelper.createMethodExpression("#{orderBy.toggle('"+ sortName + "')}", null, String.class);
l.setParent(uiColumn);
l.getChildren().add(headerFacet);
l.encodeAll(context);

uiColumnは UIColumn インスタンスで、headerFacetはリンク内でレンダリングされるテキストです。

リンクは正しく表示されます。リンクをクリックすると ajax リクエストがトリガーされます (javascript コンソールにエラーはありません)。ただし、サーバー側で次に何が起こるかわかりません。アクションが呼び出されず、テーブルがどちらも再レンダリングされていません。

ActionListener を追加すると

l.addActionListener(...);

または、パラメータ インスタンスをリンクに追加します。

UIParameter par = (UIParameter) context.getApplication().createComponent(UIParameter.COMPONENT_TYPE);
par.setValue(sortName);
par.setAssignToExpression(ULHelper.createValueExpression("#{bean.text}", String.class));
l.getChildren().add(par);

違いはなく、どちらも実行されません。

a4j:commandLink が保存されないため、2番目のリクエストでそのリンク(したがってリスナー、パラメーターなど)が見つからないため、状態の保存と関係があると思われますが、私にはありませんリンクの状態を保持 (および復元) する方法を考えてください。

4

1 に答える 1

0

役に立つかもしれない作業ソースからのサンプルだけです:

import org.ajax4jsf.component.html.HtmlAjaxCommandLink;

    public UIComponent ajaxLink(...) {
        HtmlAjaxCommandLink ajaxLink = new HtmlAjaxCommandLink();
        ajaxLink.setId(...);
        ajaxLink.setValue(...);
        ajaxLink.setAjaxSingle(true);
        ajaxLink.setOncomplete(...some js func..);
        ajaxLink.setReRender(...);
        FacesContext context = FacesContext.getCurrentInstance();
        MethodExpression actionListenerExpression = context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{someSeamComponent.someAction}", null, new Class[]{ActionEvent.class});
        MethodExpressionActionListener actionListener = new MethodExpressionActionListener(actionListenerExpression);
        ajaxLink.addActionListener(actionListener);
        return ajaxLink;
    }

uiComponent.getChildren().add(ajaxLink(...));
于 2012-10-17T10:46:10.820 に答える