5

关于 SO 和其他地方的这个主题有几个相关的问题,但我找不到关于这个特定问题的明确答案。

我有一个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");
}

我的问题:有没有一种方法可以在 JSF 内部实现这一点而无需支持 bean 的帮助?

我也在问,因为他们从 primefaces 网站上删除了代码示例,这可能表明这不是做类似事情的正确方法。

4

3 回答 3

8

将感兴趣的单元格包裹在一个简单的<h:link>.

<p:column>
    <h:link outcome="orderDetail">
        ...
    </h:link>
</p:column>

如有必要display:block,在链接上使用 CSS 以使其跨越整个单元格。如有必要,您可以使用嵌套的<f:param>.

于 2013-03-26T12:07:56.057 回答
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。

于 2013-03-26T09:08:03.887 回答
1

由于我没有找到一个真正完美的解决方案,所以我现在就是这样做的。

我现在有一个像这样的“导航器”类

@Component
public class Navigator {
  public void nav(String page) {
    UIHelper.navigateTo(page);
  }
}

我从我的 ajax 事件中调用这个类:

<p:ajax event="rowSelect" listener="#{navigator.nav('orderDetail')}"/>

正如我所说,并不是很完美,但我喜欢不必在我的支持 bean 中编写代码的事实。(当然我必须为 Navigator 编写代码,但我可以重复使用。)

于 2013-03-26T14:50:57.777 回答