如何在组件渲染器中动态创建a4j:commandLink?

时间:2012-10-16 08:55:25

标签: jsf jsf-2 richfaces ajax4jsf

我正在尝试通过扩展其渲染器为 rich:dataTable 添加一些功能。更具体地说,我想在标题列中呈现一个触发ajax调用的链接(触发辅助bean中的操作)。

所以我的想法是修改dataTable的渲染器来实例化并添加 a4j:commandLink 实例。这确实在某种程度上起作用,链接确实被渲染得很好,但是没有调用相关的动作,并且不执行添加的参数assignemnt。此外,我无法确定正在执行和呈现视图的哪些部分,似乎我设置的值被忽略(例如,如果我指定 @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没有被保存,因此第二个请求没有找到该链接(因此听众,参数等......),但是我不知道如何坚持(和恢复)链接的状态。

1 个答案:

答案 0 :(得分: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(...));