如何从Java Bean中将p:calendar组件设置为无效状态?
问题原因
- PrimeFaces 3.4.1版本的
p:calendar根组件类型为org.primefaces.component.calendar.Calendar,你将其强制转换为HtmlInputText操作的是外层容器属性,而非实际的输入框元素属性。组件本身的渲染逻辑会在输出页面时覆盖你手动给根组件设置的styleClass,所以浏览器里看不到你加的样式。 - 该版本确实存在
setValid(false)不会自动绑定ui-state-error错误样式的已知缺陷,是组件服务端渲染逻辑未适配无效状态的样式映射导致的。
解决方案
方案1:服务端修改适配组件属性
将代码调整为正确的组件类型操作,把样式加到输入框专属属性上:
import org.primefaces.component.calendar.Calendar; // 正确转换组件类型,不要转HtmlInputText Calendar calendar = (Calendar) elem; // inputStyleClass才是作用到实际输入框的样式属性 String originInputClass = calendar.getInputStyleClass(); String newInputClass = originInputClass == null ? "ui-state-error" : originInputClass + " ui-state-error"; calendar.setInputStyleClass(newInputClass); // 设置无效状态 calendar.setValid(false);
调整后要确保该p:calendar组件在请求的更新区域内,AJAX触发的话要把组件ID加到update属性里。
方案2:前端JS兜底补充
如果服务端修改后仍存在样式被组件JS覆盖的情况,可以在对应请求完成后执行JS手动加样式:
// 把下面的clientId替换为你组件的实际客户端ID,比如外层表单id为form的话就是form:x_input document.getElementById(PrimeFaces.escapeClientId('你的组件客户端ID')).classList.add('ui-state-error');
内容的提问来源于stack exchange,提问作者Marco Sulla
相关产品推荐
相关产品推荐

