Мое первое предложение состоит в том, чтобы добавить какую-либо запись отладки в ваш слушатель действия, чтобы выяснить, вызван он или нет. Если он вызывается, но ваш сайт не отображает изменения, это может быть вызвано следующими причинами.
- Слушатель действия не запускает обновление DOM на стороне клиента.
- Кнопка отправки запускает запрос. Управляемый bean-компонент извлекается и повторно инициализируется со значениями по умолчанию, поскольку он управляется в области запроса. Вы должны попытаться поместить свой бин в управление
@ViewScoped
или @SessionScoped
.
Кстати, мы не реализуем ActionListener
. Мы присваиваем выражения метода пунктам меню. Вот краткий пример макета: мы использовали действие элемента меню, чтобы переключать состояния кнопок контекстного меню. Надеюсь, я смогу тебе как-нибудь помочь.
Фрагмент Facelet:
<p:menu model="#{menuBean.model}" />
Фрагмент боба:
@ManagedBean
@ViewScoped
public class MenuBean implements Serializable {
private MenuModel model;
private boolean cutAllowed = false;
/** Creates a new instance of MenuBean */
public MenuBean() {
model = new DefaultMenuModel();
//First submenu
Submenu submenu = new Submenu();
submenu.setLabel("Dynamic Submenu 1");
MenuItem item = new MenuItem();
item.setValue("toggle");
item.setUpdate("contextMenu");
item.setAjax(true);
item.setIcon("ui-icon ui-icon-disk");
ExpressionFactory factory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
MethodExpression methodExpression = factory.createMethodExpression(FacesContext.getCurrentInstance().getELContext(), "#{menuBean.toggleCutState}", String.class, new Class[]{});
item.setActionExpression(methodExpression);
submenu.getChildren().add(item);
model.addSubmenu(submenu);
}
public boolean isCutAllowed() {
return cutAllowed;
}
public void setCutAllowed(boolean cutAllowed) {
this.cutAllowed = cutAllowed;
}
public String toggleCutState() {
toggleCutState(null);
return null;
}
public void toggleCutState(ActionEvent event) {
this.cutAllowed = !this.cutAllowed;
System.out.println("toggle called");
}
public MenuModel getModel() {
return model;
}
}