首先,所以没有误解,虽然这与PrimeFaces: conditional update on validation同样的问题我再次提出这个问题,因为对这个问题的回答是我不能接受的 ,因为虽然它可能给原始海报提供了他们所要求的解决方法,但它并没有真正回答这个问题,而且这种解决方法对我不起作用。
所以,这是我的问题:如何根据子指令的结果有条件地更新一个primefaces组件?
我有一个组件,在任何情况下都不能更新,除非验证成功并且后端代码已成功执行。 (即如果验证成功但后端存在SQL异常,则组件仍不应更新)。
为什么我不能一直更新它?如果逻辑没有成功,它将被更新为单击提交按钮之前的相同内容。 因为我不能。这是验证码组件。如果你通过ajax更新它,它就会消失,故事结束。在Primefaces打开了一张票,他们将其关闭,因为无法修复,因为闪存组件不应该用ajax更新。
所以当我提交表单时,除非逻辑成功,否则我需要单独留下验证码。如果逻辑成功,我需要确保验证码在屏幕外消失。什么是最简单,最干净的方法呢?
如果这是一个n00b问题,请原谅。我是Primefaces和JSF的新手。
答案 0 :(得分:10)
RequestContext.getCurrentInstance().update("clientId")
帮助进行条件更新。
重新尝试
RequestContext.getCurrentInstance().execute("Recaptcha.destroy()");
答案 1 :(得分:9)
您可以结合使用JavaScript和RemoteCommand:
<p:commandLink action="#{bean.doIt()}" process="@form" update="@none" oncomplete="if(!args.validationFailed){updateMyImportantUI();}" />
<p:remoteCommand name="updateMyImportantUI" process="@this" update=":myImportantID" />
答案 2 :(得分:1)
您可以在辅助bean中使用变量并在xhtml部分使用它 像这样:
update="#{backingMB.updateString}"
因此,在条件之后您可以设置updateString
的值,但是当您在backingMB
上定义它时,您需要将其设置为:
String updateString=""; // this will be id of the component to be updated
这样你就不会得到NullPointerException。