在SO和elsewhere上有关于此主题的几个相关问题,但我找不到关于这个具体问题的明确答案。
我有一个p:dataTable
,我希望有可能点击一行并打开一个详细信息页面(一个新页面,而不是对话框或窗口)。
我已经用这种方式解决了这个问题(我从primefaces网站上找到了它,由于某种原因它不再存在:http://web.archive.org/web/20101001223235/http://www.primefaces.org/showcase/ui/datatableRowSelectionInstant.jsf):
<p:dataTable var="order" value="#{orderBean.orders}" selection="#{orderBean.selectedOrder}" selectionMode="single" rowKey="#{order.number}">
<p:ajax event="rowSelect" listener="#{orderBean.orderSelect}"/>
<p:column ... />
</p:dataTable>
然后在bean中执行导航:
public void orderSelect(SelectEvent event) {
ConfigurableNavigationHandler nh = (ConfigurableNavigationHandler)FacesContext.getCurrentInstance().getApplication().getNavigationHandler();
nh.performNavigation("orderDetail?faces-redirect=true");
}
我的问题:有没有办法在没有辅助bean的帮助下在JSF内部执行此操作?
我也在问,因为他们从primefaces网站上删除了代码exmaple,这可能表明这不是做这样的事情的正确方法。
答案 0 :(得分:8)
将感兴趣的细胞包裹在一个简单的<h:link>
中。
<p:column>
<h:link outcome="orderDetail">
...
</h:link>
</p:column>
在链接上使用必要的CSS display:block
以使其跨越整个单元格。如有必要,您可以使用嵌套的<f:param>
传递请求参数。
答案 1 :(得分:1)
因为它是一个ajax请求,所以通常使用请求/响应来重新呈现网页中的一些组件。你能做的是
<p:ajax event="someventofintrest" onsuccess="javascript:myjsmethod();"></p:ajax>
and
<p:remotecommand name="myjsmethod" action="#{mybean.mybeanmethod}" />
and in the backing bean
public String mybeanmethod(){
return "mynewpage"; // Navigate away to mynewpage.xhtml
}
HTH。
答案 2 :(得分:1)
由于我没有找到一个非常完美的解决方案,我现在就是这样做的。
我现在有一个像这样的“导航器”类
@Component
public class Navigator {
public void nav(String page) {
UIHelper.navigateTo(page);
}
}
我从我的ajax事件中调用这个类:
<p:ajax event="rowSelect" listener="#{navigator.nav('orderDetail')}"/>
正如我所说,并不是很完美,但我喜欢这样一个事实,即我不必在我的支持bean中编写代码。 (当然我必须为Navigator编写代码,但我可以重复使用。)