我正在尝试通过扩展其渲染器为 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没有被保存,因此第二个请求没有找到该链接(因此听众,参数等......),但是我不知道如何坚持(和恢复)链接的状态。
答案 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(...));