【发布时间】: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