Jsf Primefaces存在非ajax请求的就地问题

Jsf Primefaces存在非ajax请求的就地问题,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我正在使用primefaces inplace编辑器。(3.2、3.3、3.4RC1和3.4快照) 当表单是通过非ajax请求提交的,并且表单中的其他一些必填字段没有填写时,页面应该重新加载并显示所需的消息。但实际发生的是:随着页面重新加载和requiredMessage,inplace编辑器已经显示出来。如何解决这个问题 重现问题的示例代码 <h:form prependId="false"> <p:inplace editor="true" widgetVar="X

我正在使用primefaces inplace编辑器。(3.2、3.3、3.4RC1和3.4快照)

当表单是通过非ajax请求提交的,并且表单中的其他一些必填字段没有填写时,页面应该重新加载并显示所需的消息。但实际发生的是:随着页面重新加载和requiredMessage,inplace编辑器已经显示出来。如何解决这个问题

重现问题的示例代码

<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>

我敢打赌这是
中的一个bug。从
InplaceRenderer#encodeMarkup()
方法:

boolean validationFailed = context.isValidationFailed();
String displayStyle = validationFailed ? "none" : "inline";
String contentStyle = validationFailed ? "inline" : "none";
它不会检查验证失败是否与“自己的”表单有关,因此无论提交的表单是什么,都会在验证失败时显示。除了编辑PrimeFaces源代码、创建自定义渲染器和/或发布错误报告之外,您实际上没有什么可以做的

您可以在
widgetVar
上的JavaScript帮助下手动关闭inplace编辑器来解决此问题。它有一个关闭编辑器的
cancel()
函数

<p:commandButton binding="#{foo}" value="Submit" action="#{smsAlertBean.dummyAction}" ajax="false" />
<h:outputScript rendered="#{param.containsKey(foo.clientId)}">X.cancel();</h:outputScript>

X.取消();
(因此,当实际按下命令按钮时,将呈现此脚本)


然而,这对速度较慢的机器/浏览器来说只是一个丑陋的影响。就地编辑器闪烁。考虑到PrimeFoes的成员, IpPuleReNeReorder-<代码>应该首先检查验证失败是否涉及到自己的形式。

我猜你们不能把它们全部放在一种形式中吗?不,我不能把它们放在一种形式中。但将它们放在一个表格中仍然没有帮助。我不确定我是否理解“已经显示”。你说“已经”是什么意思?在你提交表单之前,它已经显示了吗?我的意思是:1表单,而不是
ajax=“false”
do
process=“@form”update=“@form”
噢,当你提交表单时,它会在没有用户交互的情况下显示。已经报告为bug(请投票):而不是使用
cancel()
函数(这会导致ajax更新)您可以调用
hide()
@siebz0r:Hmm,我一开始没有注意到ajax请求,但我观察到
cancel()
立即隐藏,而
hide()
非常明显地淡出。这可能可以通过提供不同且更好的
效果
效果速度
属性进行调整。
cancel()
调用更新以确保重置任何输入元素<代码>隐藏()但是“只是隐藏”。