如何在单击菜单项时指定支持bean回调?

问题描述 投票:2回答:1

我通过将值绑定到支持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中的方法。我注意到command中的DefaultMenuItem属性未在Primefaces源代码中使用,并且未在Primefaces 6.2用户指南中记录。

我在https://gitlab.com/krichter/primefaces-menuitem-bean-callback提供SSCCE。它不包含比上述MCVE更多的信息,仅用于简化问题的调查。

我正在使用Primefaces 6.2。

jsf primefaces menu callback menu-items
1个回答
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的同一菜单项中组合“URL”参数和Action命令。如果您需要发送到新位置,您的Command只需将其作为字符串返回,您将导航到该页面,例如:

public String onMenuItemClick(String message) {
      System.out.println(BackingBeanView0.class.getName()+" message: "+message);
      return "/index.xhtml";
}
© www.soinside.com 2019 - 2024. All rights reserved.