当组件触发 Ajax 请求时,跳过对该组件的验证

Skip validation on a component when an Ajax request is triggered by that component

提问人:Jasper de Vries 提问时间:10/12/2023 最后编辑:Jasper de Vries 更新时间:10/12/2023 访问量:81

问:

我有一个组件,我想在其中显示基于所选项目的链接。一个视觉示例:p:autoComplete

为此,我在值更改时更新组件。其中一部分是在事件中有一个侦听器。只要不需要自动完成组件,这就可以很好地工作。当它需要时,我遇到了显示的必需验证器消息。p:autoCompletep:ajaxclear

因此,当事件触发请求时,我尝试跳过验证。受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 捆绑在一起)。

Ajax JSF Primefaces

评论


答:

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.clientIdclear
1赞 BalusC 10/13/2023
嗯,对我有用。也许在你的背景下不是你所期望的?#{component}
0赞 Jasper de Vries 10/13/2023
我能够在自动完成标签前面加上 ,因此隐式对象按预期工作。将接受您的答案,因为它适合您。将通过解决方法解决我的问题。#{component.clientId}