Primefaces - 仅在验证通过后但在调用操作方法之前执行 Javascript
Primefaces - Executing Javascript only after validation passes but before action method is called
我有一个 Primefaces 对话框,用户可以在其中输入一些数据。点击保存后,我需要验证数据(以标准的 JSF 方式),如果它通过,则需要调用一些 Javascript 才能显示不确定的进度条并隐藏表单按钮 - 这是因为后端处理繁重,操作方法可能需要几秒钟才能完成。
我知道有 args.validationFailed 可以在 oncomplete 中使用,但这只有在动作方法完成后才有效,但为时已晚。
目前 javascript 显然是在单击按钮时执行的,但我不确定如何继续。是否有任何方法可以在验证通过后但在调用操作方法之前启动 referPressed 函数?
JSF 片段
<p:commandButton value="Refer" actionListener="#{manageTrickleData.setLogToReferred}"
onclick="referPressed();" update="subview1:mainForm:tabs:tablePanel2
subview1:mainForm:tabs:tablePanel commentMessage" styleClass="dialogButtons">
</p:commandButton>
Javascript
function referPressed() {
$('.dialogButtons').hide();
$('.ui-progressbar-indeterminate').show();
}
您可以使用 <p:remoteCommand>
。只需让 <p:commandButton>
在没有验证错误的情况下完成调用它,然后让 <p:remoteCommand>
调用所需的操作。
<p:commandButton value="Refer" styleClass="dialogButtons"
update="commentMessage"
oncomplete="if (!args.validationFailed) { referPressed(); setLogToReferred(); }">
</p:commandButton>
<p:remoteCommand name="setLogToReferred"
action="#{manageTrickleData.setLogToReferred}"
update="subview1:mainForm:tabs:tablePanel2 subview1:mainForm:tabs:tablePanel">
</p:remoteCommand>
如评论中所述,这是不可能的,因为验证发生在服务器端。
您还可以使用 ajax 强制验证更改并在无效时禁用提交按钮。
<p:inputText value="#{bean.entity.comment}">
<p:ajax event="change" update="btnSave"/>
</p:inputText>
<p:commandButton id="btnSave" disabled="#{bean.entity.comment ne null}" onStart="referPressed();" onComplete="hideProgressBar();"/>
为了使其更加灵活,您可以通过编程方式调用 bean 验证或执行自定义验证,例如:
<p:commandButton id="btnSave" disabled="#{not bean.isValid(bean.entity)}" />
这些解决方案显示了 JSF 验证服务器端的问题。我们程序员需要 JSF 向服务器发出两个请求,并让我们在验证阶段后加入一个新的 ajax 回调状态,如 onEvent="if (data.status == 'validate') { };
或 primefaces onValidate
来解决这个问题。
我有一个 Primefaces 对话框,用户可以在其中输入一些数据。点击保存后,我需要验证数据(以标准的 JSF 方式),如果它通过,则需要调用一些 Javascript 才能显示不确定的进度条并隐藏表单按钮 - 这是因为后端处理繁重,操作方法可能需要几秒钟才能完成。
我知道有 args.validationFailed 可以在 oncomplete 中使用,但这只有在动作方法完成后才有效,但为时已晚。
目前 javascript 显然是在单击按钮时执行的,但我不确定如何继续。是否有任何方法可以在验证通过后但在调用操作方法之前启动 referPressed 函数?
JSF 片段
<p:commandButton value="Refer" actionListener="#{manageTrickleData.setLogToReferred}"
onclick="referPressed();" update="subview1:mainForm:tabs:tablePanel2
subview1:mainForm:tabs:tablePanel commentMessage" styleClass="dialogButtons">
</p:commandButton>
Javascript
function referPressed() {
$('.dialogButtons').hide();
$('.ui-progressbar-indeterminate').show();
}
您可以使用 <p:remoteCommand>
。只需让 <p:commandButton>
在没有验证错误的情况下完成调用它,然后让 <p:remoteCommand>
调用所需的操作。
<p:commandButton value="Refer" styleClass="dialogButtons"
update="commentMessage"
oncomplete="if (!args.validationFailed) { referPressed(); setLogToReferred(); }">
</p:commandButton>
<p:remoteCommand name="setLogToReferred"
action="#{manageTrickleData.setLogToReferred}"
update="subview1:mainForm:tabs:tablePanel2 subview1:mainForm:tabs:tablePanel">
</p:remoteCommand>
如评论中所述,这是不可能的,因为验证发生在服务器端。
您还可以使用 ajax 强制验证更改并在无效时禁用提交按钮。
<p:inputText value="#{bean.entity.comment}">
<p:ajax event="change" update="btnSave"/>
</p:inputText>
<p:commandButton id="btnSave" disabled="#{bean.entity.comment ne null}" onStart="referPressed();" onComplete="hideProgressBar();"/>
为了使其更加灵活,您可以通过编程方式调用 bean 验证或执行自定义验证,例如:
<p:commandButton id="btnSave" disabled="#{not bean.isValid(bean.entity)}" />
这些解决方案显示了 JSF 验证服务器端的问题。我们程序员需要 JSF 向服务器发出两个请求,并让我们在验证阶段后加入一个新的 ajax 回调状态,如 onEvent="if (data.status == 'validate') { };
或 primefaces onValidate
来解决这个问题。