当前位置: 首页 > 知识库问答 >
问题:

Primefaces 4,动态菜单设置命令方法

朱宏爽
2023-03-14

我正在尝试primefaces 4,但是没有新的菜单模型的文档。在这里,擎天柱用一个小例子描述了新的菜单系统。http://blog.primefaces.org/?p=2594

此时,他写了一个setCommand方法:

这指向一个保存方法(可在pf4 showcase中找到:http://www.primefaces.org/showcase/ui/menu/menu.xhtml):

在这篇介绍之后,问题来了。我正在从一个bean创建一个动态菜单,但我不明白如何知道用户点击的菜单并执行正确的操作。

public void init() {
        if (spBean == null) {
            System.out.println("spBean is NULL!");
            return;
        }
        for (ServiceProvider sp: spBean.getListaSP()) {
            DefaultMenuItem item = new DefaultMenuItem(sp.getNome());
            //item.setUrl("#");
            item.setIcon("images/sps/" + sp.getImageId() + ".png");
            item.setCommand("#{dockMenuBackingBean.setNewMenu}");
            //
            model.addElement(item);
            System.out.println(sp.getNome());
        }
    }

    public void setNewMenu() {
        System.out.println("A menu was clicked BUT witch menu? Arghh!!");
        //
    }

我想做的是更改ServiceProviderBackingBean中的spSelected,就像我在PF3中做的那样。5:

<p:dock>
    <c:forEach items="#{serviceProvidersBean.sps}" var="sp">
        <p:menuitem 
            value="#{sp.spInstanceName}" 
            icon="/images/sps/#{sp.spInstanceId}.png" 
            update=":form:spDetail" >
            <f:setPropertyActionListener 
                value="#{sp}"   
                target="#{serviceProvidersBean.spSelected}" />
        </p:menuitem>
    </c:forEach>
</p:dock>

有什么帮助吗?

编辑:

事实上,我正在这样做,但我正在寻找一种更好、更干净的方法来实现这一点。

public void init() {
    if (spBean == null) {
        System.out.println("spBean is NULL!");
        return;
    }
    for (ServiceProvider sp: spBean.getListaSP()) {
        DefaultMenuItem item = new DefaultMenuItem(sp.getNome());
        //item.setUrl("#");
        item.setIcon("images/sps/" + sp.getImageId() + ".png");
        String command = String.format("#{dockMenuBackingBean.setNewMenu('%d')}", spBean.getListaSP().indexOf(sp));
        item.setCommand(command);
        //
        model.addElement(item);
        System.out.println(sp.getNome());
    }
}

public void setNewMenu(Object x) {
    Integer selectedId = Integer.parseInt((String)x);
    System.out.println("Menu changed " + Integer.toString(selectedId));
    //
}

共有2个答案

慕永年
2023-03-14

擎天柱在这里,使用setParam(键,值)。为此,您需要更新到主干代码。

司马同
2023-03-14

通过setParam(key, value)设置命令参数可以这样完成:

在生成bean的菜单中:

DefaultMenuItem item = new DefaultMenuItem("display list");
item.setId("listMenuItem");
item.setCommand("#{myBean.displayList}");
item.setParam("listId", 1l);

在托管bean中包含以下操作:

public String displayList(ActionEvent event) {
    MenuItem menuItem = ((MenuActionEvent) event).getMenuItem();
    Long id = Long.parseLong(menuItem.getParams().get("listId").get(0));
    findListBy(id);
}

读取参数似乎有点复杂。但是ActionListeners不支持Primeface 4 MenuItem(因为它们不再从UICommand派生),所以params似乎是一种新的方式。

 类似资料:
  • 本文向大家介绍AngularJS动态菜单操作指令,包括了AngularJS动态菜单操作指令的使用技巧和注意事项,需要的朋友参考一下 前言         在我们创建一个angularJS应用的时候,菜单往往往是不可或缺的元素之一。也许在我们静态菜单的时候不会发现在指令中操作菜单收缩、折叠展开没有任何问题,因为我们在操作之前,页面元素渲染已经完成,所以在指令里面通过element查找目标元素可以成功

  • 实现带动画效果的下拉菜单。用户按下菜单按钮,出现下拉按钮,用户松开菜单按钮,下拉按钮收回。 [Code4App.com]

  • Since 8.2 setToolbarMenu 自定义分享面板第二栏的工具栏内容。 注意:由于苹果的ATS限制,icon URL必须为https链接或base64,http链接会被忽略 使用方法 AlipayJSBridge.call('setToolbarMenu', { menus: [ { name: "字体", tag: "H5MenuActionOf

  • 在时间视图中,从显示屏上方向下滑动,可下拉快速设置菜单。向左或向右滑动进行浏览,轻触可选择免打扰功能或飞行模式: 闹钟 : 设置闹铃重复:关闭、一次、周一至周五或每天。如果您选择一次、周一至周五或每天,同时也要设置闹钟的时间。 设置闹铃后,时间视图中将显示时钟图标。 免打扰:轻触免打扰图标可启用它,再次轻触将关闭图标。当启用免打扰时,您不会收到任何通知或来电提醒。背光灯激活手势也会被禁用。 飞行模

  • 在时间视图中,从显示屏上方向下滑动,可下拉快速设置菜单。 向左或向右滑动进行浏览,轻触可选择一个功能。 轻触 可定制您想在快速设置菜单中看到的功能。从闹铃、倒计时器、请勿打扰和飞行模式中进行选择。 闹铃:设置闹铃重复:关闭、一次、周一至周五或者 每天。如果您选择一次、周一至周五或每天,同时也要设置闹钟的时间。 启用闹铃后,时间视图中将显示时钟图标。 倒计时器:选择设置计时器,然后设置倒计时时间并按

  • 为您重复使用的命令行任务设置快捷方式。如果你发现自己需要在命令行中重复输入同样的东西,那么设置命令行快捷方式非常有必要。 TL;DR 使命令行为您工作;创建容易记住和快速键入的别名。 尝试保存 Github dotfiles 项目,共享和同步您的命令行快捷方式。 如何设置快捷方式 创建命令行快捷方式的最简单的方法是将常用命令的别名添加到bashrc文件。 在Mac或Linux上: 从命令行的任何位