【问题标题】:Primefaces 5 - Dynamic p:menu issuesPrimefaces 5 - 动态 p:menu 问题
【发布时间】:2014-07-07 08:56:21
【问题描述】:

我是 Primefaces 的新手,我正在关注 User Guide of Version 5.0。 我已经成功构建了一个静态菜单。现在我正在尝试构建一个非常简单的动态菜单,基本上是复制粘贴用户指南上的示例(如果您有兴趣,请参见第 294 页)。但它不起作用。

这是我的 XHTML 页面:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>test-primefaces</title>
</h:head>
<h:body>
    <h:form>
        <p:menu model="#{menuBean.model}" />
    </h:form>
</h:body>

这是我的 MenuBean.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuModel;

@ManagedBean
@SessionScoped
public class MenuBean {

   private MenuModel model;

   public MenuBean() {
       model = new DefaultMenuModel();
       //First submenu
       DefaultSubMenu firstSubmenu = new DefaultSubMenu("Dynamic Submenu");
       DefaultMenuItem item = new DefaultMenuItem("External");
       item.setUrl("http://www.primefaces.org");
       item.setIcon("ui-icon-home");
       firstSubmenu.addElement(item);
       model.addElement(firstSubmenu);

       //Second submenu
       DefaultSubMenu secondSubmenu = new DefaultSubMenu("Dynamic Actions");
       item = new DefaultMenuItem("Save");
       item.setIcon("ui-icon-disk");
       item.setCommand("#{menuBean.save}");
       item.setUpdate("messages");
       secondSubmenu.addElement(item);
       item = new DefaultMenuItem("Redirect");
       item.setIcon("ui-icon-search");
       item.setCommand("#{menuBean.redirect}");
       secondSubmenu.addElement(item);
       model.addElement(secondSubmenu);
   }

   public MenuModel getModel() {
       return model;
   }
}

菜单不起作用,当我尝试运行项目时(我正在使用 Netbeans)我收到以下错误

找不到从“j_idt5:j_idt6”引用的表达式“messages”的组件。

我无法理解为什么会得到它,而且 Google 也无法帮助我。 大多数疑问是关于我在 MenuBean.java 中使用的注解和导入,因为 Netbeans 告诉我来自“javax.faces.bean”的注解将在下一个 JSF 版本中被弃用。

另一个奇怪的事实,在 XHTML 页面中,如果我改变了

&lt;p:menu model="#{menuBean.model}" /&gt;&lt;p:megaMenu model="#{menuBean.model}" /&gt;

我没有收到错误,但菜单没有呈现两个菜单项,我只看到一个带有“动态子菜单”和“动态操作”的菜单,没有任何子条目。

我错过了什么?如有必要,我愿意提供有关我的代码/项目的更多信息。

【问题讨论】:

  • 查看展示中的程序化菜单:primefaces.org/showcase/ui/menu/menu.xhtml。至少您需要 部分
  • 嘿,就是这样!随意发布答案,我会接受的!谢谢!
  • item.setUpdate("messages"); 期望有一个名为 messages 的组件以传递更新..
  • 注释的 oimports 怎么样,它们是正确的吗?我假设是这样,因为菜单现在可以使用,但导入的库很快就会被弃用!
  • 对于@ManagedBean,您将改用@Named,并且范围来自cdi(javax.enterprise.context),除了ViewScopejavax.faces.view.ViewScoped

标签: jsf jsf-2 primefaces menu managed-bean


【解决方案1】:

对我来说,最好先检查 Primefaces 展示柜,然后再参考手册。

根据示例"Programmatic menu",您需要该部分

<p:growl id="messages" showDetail="false"/>

我猜这实际上也是错误消息所说明的,它丢失了。

关于注释参见推荐,即here。从 JSF 2.2 开始,建议从 JSF bean 迁移到 CDI bean。

【讨论】:

    【解决方案2】:

    Cannot find component with expression "messages" referenced from "j_idt5:j_idt6" 表示它无法从具有 id="message" 的组件中找到具有 id="message" 的组件strong>id="j_idt5:j_idt6" 具有属性 update="message",在您的代码中是 item.setUpdate("messages");

    另一种解决方案是删除 item.setUpdate("messages");如果您不想更新任何内容,或者如果您想更新消息,则在页面中添加带有 id 消息的组件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 2022-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      相关资源
      最近更新 更多