Действительно. PrimeFaces (и стандартный JSF) не переоценивает EL в атрибутах on*
для каждого запроса. Это происходит только на основе просмотра. Однако RichFaces делает это в <a4j:xxx>
компонентах.
Вам нужно решить проблему по-другому. Я предлагаю вместо этого использовать visible
атрибут <p:dialog>
.
<h:form>
...
<p:commandButton value="Delete all friends?" update=":deleteDialogs" />
</h:form>
...
<h:panelGroup id="deleteDialogs">
<p:dialog id="deleteFriendsConfirmDialog" visible="#{facesContext.postback and not empty userBean.user.friendList}">
...
</p:dialog>
<p:dialog id="friendsAlreadyDeletedErrorDialog" visible="#{facesContext.postback and empty userBean.user.friendList}">
...
</p:dialog>
</h:panelGroup>
Альтернативой является использование RequestContext
PrimeFaces в методе действия bean-компонента, который позволяет программно выполнять код JavaScript в методе действия bean-компонента (хотя это слишком сильно связывает контроллер с представлением, IMO).
<p:commandButton value="Delete all friends?" action="#{userBean.deleteAllFriends}" />
с
RequestContext context = RequestContext.getCurrentInstance();
if (!user.getFriendList().isEmpty()) {
context.execute("deleteFriendsConfirmDialog.show()");
} else {
context.execute("friendsAlreadyDeletedErrorDialog.show()");
}
Не связанный с конкретной проблемой, ваш исходный onclick
, хотя он не работает в вашем конкретном случае, показывает некоторые плохие практики. Псевдопротокол javascript:
является излишним. Это уже по умолчанию. Убери это. Также лишним является тест против == 'true'
. Убери это. Просто позвольте EL печатать true
или false
напрямую. Ниже приведен правильный синтаксис (опять же, это не решает вашу проблему, только для вашей информации)
<p:commandButton
onclick="if (#{not empty userBean.user.friendList}) deleteFriendsConfirmDialog.show(); else friendsAlreadyDeletedErrorDialog.show();"
value="Delete all friends?" />
Это бы сработало, если бы вы использовали RichFaces <a4j:commandButton>
.
<a4j:commandButton
oncomplete="if (#{not empty userBean.user.friendList}) deleteFriendsConfirmDialog.show(); else friendsAlreadyDeletedErrorDialog.show();"
value="Delete all friends?" />