【问题标题】:open a menuitem page in a new tab in primefaces在 primefaces 的新选项卡中打开菜单项页面
【发布时间】:2016-09-11 06:21:38
【问题描述】:

我有一个带有 会话范围 支持 bean 的 xhtml 页面。现在我必须在新选项卡中打开此页面,右键单击新选项卡中的打开链接。 当此页面打开时,必须清除 backing bean 的模型类。 我使用了以下代码:

<p:menuitem value="Details" action="#{beanMB.clearDetailModel()}"/>

支持 bean 代码:

public void clearDetailModel()
    {
        memberModel=null;
        ......
        return "/pages/member/MemberDetails.xhtml?faces-redirect=true";
   }

上面的代码清除了会话范围的模型,但它没有在新选项卡中打开页面。

是否有任何方法可以使用上述代码在新选项卡中打开页面,或者是否有任何替代方法可以解决上述问题?任何帮助将不胜感激。 谢谢。

【问题讨论】:

  • 它不起作用,我需要右键单击打开页面 - 在新选项卡中打开链接。函数 clearDetailModel() 仅通过直接左键单击而不是右键单击调用 - 在新选项卡中打开链接。
  • 用例是什么?如果在新选项卡中打开页面时需要清除 sessioscoped 模型,则存在设计缺陷。要么引入 viewscoped bean,要么引入(基于 cdi 扩展的)窗口范围
  • 我使用了会话范围,因为我需要在表单中显示图像。如果没有会话范围,则不会显示图像。

标签: jsf primefaces tabs menuitem


【解决方案1】:

你可以试试这个:

您需要将以下代码放在 MemberDetails.xhtml 页面中。

<f:metadata>
<f:event type="preRenderView" listener="#{beanMB.clearDetailModel}"/>
</f:metadata>

并使用 menuitem 中的 url 打开您的页面。

<p:menuitem value="Details"  url="/pages/member/MemberDetails.xhtml" />

你需要修改你的backing bean代码如下:

public void clearDetailModel()
    {
        if (isNewRequest()){
        memberModel=null;
        ......
        }

   }

public boolean isNewRequest() {
        final FacesContext fc = FacesContext.getCurrentInstance();
        final boolean getMethod = ((HttpServletRequest) fc.getExternalContext().getRequest()).getMethod().equals("GET");
        final boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest();
        final boolean validationFailed = fc.isValidationFailed();
        return getMethod && !ajaxRequest && !validationFailed;
    }

这里的方法 isNewRequest() 检查请求是否是新的,如果没有检查,你的方法 clearDetailModel() 将在每次发出新请求时被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2014-02-23
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多