【问题标题】:How to dynamically create an a4j:commandLink in a component renderer?如何在组件渲染器中动态创建 a4j:commandLink?
【发布时间】:2012-10-06 07:57:28
【问题描述】:

我正在尝试通过扩展其渲染器向 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 没有被保存,因此第二个请求没有找到可以使用的链接(以及监听器、参数等),但是我不知道如何保持(和恢复)链接的状态。

【问题讨论】:

    标签: jsf jsf-2 richfaces ajax4jsf


    【解决方案1】:

    仅从工作来源中提取样本,这可能会有所帮助:

    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(...));
    

    【讨论】:

      猜你喜欢
      • 2020-07-12
      • 2020-09-02
      • 2015-09-07
      • 2021-04-15
      • 2011-04-25
      • 2015-05-18
      • 2017-08-17
      • 2021-12-28
      • 2021-09-07
      相关资源
      最近更新 更多