我正在使用 primefaces 就地编辑器。 (尝试过 primefaces 3.2、3.3、3.4RC1 和 3.4 快照)
当通过非ajax请求提交表单,并且表单中的其他一些必填字段未填写时,页面应该重新加载并显示所需的消息。但实际发生的情况是:与页面重新加载和 requiredMessage 一起,就地编辑器已经显示。如何解决这个问题?
重现问题的示例代码
<h:form prependId="false">
<p:inplace editor="true" widgetVar="X">
<p:inputTextarea value="#{smsAlertBean.alertText}" />
</p:inplace>
</h:form>
<h:form prependId="false">
<p:selectOneMenu required="true" requiredMessage="Please select">
<!-- your values -->
</p:selectOneMenu>
<p:commandButton value="Submit" action="#{smsAlertBean.dummyAction}" ajax="false" />
</h:form>
最佳答案
我敢打赌这是 <p:inplace>
中的一个错误。来自 InplaceRenderer#encodeMarkup()
方法:
boolean validationFailed = context.isValidationFailed();
String displayStyle = validationFailed ? "none" : "inline";
String contentStyle = validationFailed ? "inline" : "none";
它不会检查验证失败是否涉及“自己的”表单,因此无论提交的表单如何,都会始终显示验证失败。除了编辑 PrimeFaces 源代码、创建自定义渲染器和/或发布错误报告之外,您实际上没有什么可以做的。
您可以通过在widgetVar
上的JavaScript的帮助下手动关闭就地编辑器来解决此问题。 。它有一个cancel()
关闭编辑器的函数。
<p:commandButton binding="#{foo}" value="Submit" action="#{smsAlertBean.dummyAction}" ajax="false" />
<h:outputScript rendered="#{param.containsKey(foo.clientId)}">X.cancel();</h:outputScript>
(当实际按下命令按钮时,该脚本就会被渲染)
然而,这对慢速机器/浏览器只会产生丑陋的影响。就地编辑器闪烁。考虑reporting it as a bug PrimeFaces 的 friend 们,InplaceRenderer
应首先检查验证失败是否涉及自己的表单。
关于jsf - Primefaces 非 ajax 请求的就地问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12175047/