如何在单击菜单项时指定备用Bean回调?

时间:2018-07-30 11:25:47

标签: jsf primefaces menu callback menu-items

我正在通过将值绑定到备用Bean中的p:slideMenu来构建MenuModel的内容。这是必需的,因为内容是根据数据库查询的结果动态生成的。使用

@Named
@ViewScoped
public class BackingBeanView0 implements Serializable {
    private static final long serialVersionUID = 1L;
    private MenuModel menuModel = new DynamicMenuModel();

    @PostConstruct
    private void init() {
        DefaultMenuItem menuItem = new DefaultMenuItem("Click me!",
                null, //icon
                "/index.xhtml" //url
        );
        menuItem.setCommand("#{backingBeanView0.onMenuItemClick('Hello world!')}");
        menuItem.setImmediate(true);
        menuModel.addElement(menuItem);
    }

    [getter and setter for menuModel]

    public void onMenuItemClick(String message) {
        System.out.println(BackingBeanView0.class.getName()+" message: "+message);
    }
}

@Melloware的建议(这并不表示需要在支持bean中创建模型)导致backingBeanView0.onMenuItemClick调用

要延迟显示几秒钟。将所需的backing bean方法移至视图范围的bean不会改变此行为。

onXXX上的Javascript回调的DefaultMenuItem属性不能用于触发支持bean afaik中的方法。我注意到command中的DefaultMenuItem属性没有在Primefaces源代码中使用,并且没有在Primefaces 6.2用户指南中记录。

我在https://gitlab.com/krichter/primefaces-menuitem-bean-callback提供了一个SSCCE。除了上面的MCVE之外,它不包含更多信息,而仅仅是为了简化问题调查而存在。

我正在使用Primefaces 6.2。

1 个答案:

答案 0 :(得分:2)

我想我知道你在问什么。在下面的示例中,我调用了bean控制器方法myController.changeAccount,并且还提供了OnComplete Javascript回调,就像我在XHTML中构建菜单一样。

final DefaultMenuItem item = new DefaultMenuItem(bean.getLongName());
item.setCommand("#{myController.changeAccount('" + bean.getShortName() + "')}");
item.setImmediate(true);
item.setOncomplete("melloware.handleAccountChange(xhr, status, args);");

更改:

DefaultMenuItem menuItem = new DefaultMenuItem("Click me!",
                null, //icon
                "/index.xhtml" //url
        );

收件人:

DefaultMenuItem menuItem = new DefaultMenuItem("Click me!");

不能将“ URL”参数和Action命令组合在同一菜单项中,因为它首先使用URL。如果您需要发送到新位置,只需将Command作为字符串返回即可,例如,您将导航至该页面:

public String onMenuItemClick(String message) {
      System.out.println(BackingBeanView0.class.getName()+" message: "+message);
      return "/index.xhtml";
}