Primefaces/jsf中的条件更新

7
首先,为了避免误解,虽然这跟PrimeFaces: conditional update on validation是同一个问题,但我还是要再问一遍,因为我并不认可那个问题的答案。尽管它可能给原作者提供了解决方案,但它并没有真正回答这个问题,并且这种解决方案并不适用于我。
所以,我的问题是:如何根据提交结果有条件地更新primefaces组件?
我有一个组件,在任何情况下都不应该被更新,除非验证成功并且后端代码成功执行。(即,如果验证成功但在后端有SQL异常,该组件仍然不应被更新)。
为什么我不能总是更新它?如果逻辑不成功,它将被更新为之前单击提交按钮时的相同内容。因为我不能。这是验证码组件。如果通过ajax更新它,它会消失,就这样了。Primefaces开了一个工单,将其关闭为“无法修复”,因为flash组件不应该使用ajax进行更新。
因此,当我提交表单时,除非逻辑成功,我需要保留验证码。如果逻辑成功,我需要确保验证码从屏幕上消失。最简单、最清晰的方法是什么?
如果这是一个n00b问题,请原谅。我对Primefaces和JSF非常陌生。
3个回答

14
RequestContext.getCurrentInstance().update("clientId")

帮助实现条件更新。

尝试使用reCAPTCHA

RequestContext.getCurrentInstance().execute("Recaptcha.destroy()");

1
从Primefaces 7开始,RequestContext.getCurrentInstance()不再可用,应改用PrimeFaces.current().ajax() - Mohsen

13

您可以使用JavaScript和RemoteCommand的组合:

<p:commandLink action="#{bean.doIt()}" process="@form" update="@none" oncomplete="if(!args.validationFailed){updateMyImportantUI();}" />

<p:remoteCommand name="updateMyImportantUI" process="@this" update=":myImportantID" />     

没有想到将条件放在oncomplete=""中而不是remoteCommand中。谢谢! - Andrew

2
您可以在后备bean中使用变量,并在xhtml部分中使用它。
就像这样:
update="#{backingMB.updateString}"

所以,在你添加条件之后,可以为updateString设定值,但是当你在backingMB中定义它时,你需要这样写:
String updateString=""; // this will be id of the component to be updated  

这样你就不会遇到空指针异常了。

1
我正在尝试这个...当提交表单(即选择“确定”按钮)时,如何“更新”updateString?我的做法是检查错误,如果一切正常,则关闭对话框并更新父级,如果有错误,则不关闭对话框并应更新对话框消息部分。但是,在选择“确定”后,我的表单被提交,但updateString未被更新。 - Danijel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接