我有一个页面显示一些个人资料,因此它是网址../faces/savedProfile.xhtml?profileId=1234
。
在该页面上,我有一个p:窗格,其中包含一些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?
答案 0 :(得分:1)
rendered
属性不仅在HTTP请求期间进行评估,该请求返回带有命令链接的页面,但在命令链接发起的HTTP请求期间也会对其进行评估。显然,您在HTTP请求期间没有保留请求参数,导致rendered
属性评估false
,因此无法识别单击的命令链接,因此其动作事件将永远不会排队。
这符合commandButton/commandLink/ajax action/listener method not invoked or input value not updated的第5点。
您的案例中的解决方案是添加<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>
与视图范围的bean(以及Profile
转换器)结合使用:
<f:viewParam name="profileId" value="#{profileController.profile}" />
与
<p:panel rendered="#{profileController.canViewProfile and not empty profileController.profile}">