Не работает p:commandLink при использовании #{param} в отображаемом атрибуте
У меня есть страница с некоторым профилем, так что это URL ../faces/savedProfile.xhtml?profileId=1234
,
На этой странице у меня есть p: pane, содержащая несколько компонентов p: commandLink, примерно так:
<p:panel rendered="#{profileController.canViewProfile}">
...
<p:commandLink
id="duplicateLink"
value="Duplicate"
action="#{profileController.duplicateProfile}"/>
...
</p:panel>
Оно работает. Теперь я хочу добавить еще одно условие рендеринга:
<p:panel rendered="#{profileController.canViewProfile
and param['profileId'] != null}">
...
<p:commandLink
id="duplicateLink"
value="Duplicate"
action="#{profileController.duplicateProfile}"/>
...
</p:panel>
Отображается p: commandLink, но он не активен. Кажется, что метод действия не вызывается при клике. Почему это дополнительное условие рендеринга убивает commandLink?
1 ответ
rendered
Атрибут оценивается не только во время HTTP-запроса, который возвращает страницу со ссылкой на команду, но также и во время HTTP-запроса, инициируемого ссылкой на команду. Видимо, вы не сохраняете параметр запроса во время этого HTTP-запроса, который вызывает rendered
атрибут оценивает false
и, таким образом, ссылка на нажатую команду не может быть идентифицирована, и, следовательно, ее событие действия никогда не будет поставлено в очередь.
Это соответствует пункту 5 метода commandButton/commandLink/ajax action/listener, который не вызывается, или входное значение не обновляется.
Решение в вашем случае заключается в добавлении <f:param>
сохранить параметр запроса:
<p:commandLink ...>
<f:param name="profileId" value="#{param.profileId}" />
</p:commandLink>
Не связано с конкретной проблемой, лучше использовать empty
вместо != null
который будет также покрывать пустые строки:
<p:panel rendered="#{profileController.canViewProfile and not empty param.profileId}">
Или намного лучше, используйте <f:viewParam>
в сочетании с фасолью видимости (и Profile
конвертер):
<f:viewParam name="profileId" value="#{profileController.profile}" />
с
<p:panel rendered="#{profileController.canViewProfile and not empty profileController.profile}">