Как указать обратный вызов 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 (это не указывает на необходимость создания модели в компоненте поддержки) приводит к backingBeanView0.onMenuItemClick
быть не призванным
отображаться с задержкой на несколько секунд. Перемещение необходимого метода bean-компонента на видовой объект не изменяет это поведение.
onXXX
свойства для обратных вызовов Javascript на DefaultMenuItem
не может использоваться для запуска метода в бэк-компоненте afaik. Я заметил, что command
недвижимость в DefaultMenuItem
не используется в исходном коде Primefaces и не задокументировано в руководстве пользователя Primefaces 6.2.
Я предоставляю SSCCE по адресу https://gitlab.com/krichter/primefaces-menuitem-bean-callback. Он не содержит больше информации, чем MCVE, описанный выше, и просто существует, чтобы облегчить исследование проблемы.
Я использую Primefaces 6.2.
1 ответ
Я думаю, я знаю, что вы спрашиваете. В приведенном ниже примере я вызываю метод контроллера 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. Если вам нужно отправить в новое место, попросите вашу Команду просто вернуть ее в виде строки, и вы перейдете на эту страницу, например:
public String onMenuItemClick(String message) {
System.out.println(BackingBeanView0.class.getName()+" message: "+message);
return "/index.xhtml";
}