PrimeFaces10客户端校验下带for属性的p:messages不展示p:textEditor必填消息
问题根因
这是PrimeFaces 10版本p:textEditor组件客户端校验的固有实现差异,不是配置遗漏导致的:
- 普通输入组件复用了PrimeFaces通用客户端校验框架,生成的校验消息会自动匹配对应
for属性的p:messages组件 p:textEditor基于Quill编辑器封装,客户端校验逻辑是单独实现的,没有适配带for属性的p:messages的消息匹配规则,生成的校验消息只会被全局无for属性的p:messages捕获
可行解决方案
可根据业务场景选择以下任意一种方案解决:
- 版本升级:直接升级到PrimeFaces 11及以上版本,该问题在后续版本中已经被官方修复,
p:textEditor的校验消息已经可以正常匹配带for属性的p:messages组件 - 覆写校验逻辑:如果无法升级版本,可以添加以下JS代码覆写
p:textEditor的校验后逻辑,手动将校验消息推送到你指定的zoneMessage组件:
if (PrimeFaces.widget.TextEditor) { const originalPostValidate = PrimeFaces.widget.TextEditor.prototype.postValidate; PrimeFaces.widget.TextEditor.prototype.postValidate = function(valid, msg) { originalPostValidate.call(this, valid, msg); if (!valid) { const zoneMsgWidget = PrimeFaces.getWidgetById('zoneMessage'); if (zoneMsgWidget) { zoneMsgWidget.show([{ severity: 'error', summary: msg, clientId: this.getClientId() }]); } } } }
- 服务端校验兜底:如果接受关闭
p:textEditor的客户端校验,只保留服务端校验,服务端返回的校验消息符合通用规则,可以正常被带for属性的p:messages捕获,只需要给p:textEditor添加clientSideValidation="false"属性即可。
内容的提问来源于stack exchange,提问作者Yves Fréchette
相关产品推荐
相关产品推荐

