Как указать обратный вызов 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";
}
Другие вопросы по тегам