提问人:Jasper de Vries 提问时间:10/12/2023 最后编辑:Jasper de Vries 更新时间:10/12/2023 访问量:81
当组件触发 Ajax 请求时,跳过对该组件的验证
Skip validation on a component when an Ajax request is triggered by that component
问:
我有一个组件,我想在其中显示基于所选项目的链接。一个视觉示例:p:autoComplete
为此,我在值更改时更新组件。其中一部分是在事件中有一个侦听器。只要不需要自动完成组件,这就可以很好地工作。当它需要时,我遇到了显示的必需验证器消息。p:autoComplete
p:ajax
clear
因此,当事件触发请求时,我尝试跳过验证。受JSF skip Required-Validation without immediate=true的启发,我尝试过:clear
<p:autoComplete required="#{param['javax.faces.source'] ne component.clientId and ...}"
...>
<p:ajax event="clear" update="..."/>
</p:autoComplete>
和:
<p:autoComplete required="#{empty param['primefaces.resetvalues'] and ...}"
...>
<p:ajax event="clear" update="..." resetValues="true"/>
</p:autoComplete>
但两者都不起作用。我想要的可能吗?请注意,该组件用作自定义标签,因此我无法对完整的 clientId 进行硬编码。
我正在使用 JSF 2.3(与最近的 Payara 5 捆绑在一起)。
答:
1赞
BalusC
10/12/2023
#1
ajax 事件类型作为请求参数传递,名称为 javax.faces.behavior.event
。
所以这应该做:
<p:autoComplete required="#{param['javax.faces.behavior.event'] ne 'clear'}">
明智的做法是仔细检查它是否在组件本身上调用,否则当 ajax 事件恰好被另一个组件触发时,它也会被跳过:
<p:autoComplete required="#{not (
param['javax.faces.source'] eq component.clientId
and
param['javax.faces.behavior.event'] eq 'clear'
)}">
评论
0赞
Jasper de Vries
10/12/2023
但是我尝试过的应该有效,对吧?该检查应通过组件传递任何 Ajax 请求,而不仅仅是 .param['javax.faces.source'] ne component.clientId
clear
1赞
BalusC
10/13/2023
嗯,对我有用。也许在你的背景下不是你所期望的?#{component}
0赞
Jasper de Vries
10/13/2023
我能够在自动完成标签前面加上 ,因此隐式对象按预期工作。将接受您的答案,因为它适合您。将通过解决方法解决我的问题。#{component.clientId}
评论