1

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

所以我的第一个想法是修改dataTable的渲染器以实例化并添加一个a4j:commandLink实例。这在某种程度上确实有效,链接确实可以很好地呈现,但是没有调用相关的操作,并且没有执行添加的参数分配。此外,我无法真正弄清楚视图的哪些部分正在执行和渲染,似乎我设置的值被忽略了(例如,如果我将@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 没有被保存,因此第二个请求没有找到可以使用的链接(因此监听器、参数等......),但我没有想法如何保持(和恢复)链接的状态。

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 回答