【问题标题】:Conditional update in Primefaces/jsfPrimefaces/jsf 中的条件更新
【发布时间】:2012-12-04 19:21:15
【问题描述】:

首先,为了避免误解,虽然这和PrimeFaces: conditional update on validation是同一个问题,但我再次问,因为该问题的答案对我来说是不可接受的,因为虽然它可能为原始发帖人提供了他们所要求的解决方法,但它并没有真正回答问题,而且这种解决方法对我不起作用。

那么,我的问题是:如何根据提交结果有条件地更新 primefaces 组件?

我有一个组件,在任何情况下都不得更新,除非验证成功并且后端代码已成功执行。 (即如果验证成功但后端出现 SQL 异常,则组件仍不应更新)。

为什么我不能总是更新它?如果逻辑不成功,它将被更新为单击提交按钮之前的状态。 因为我做不到。这是验证码组件。如果您通过 ajax 更新它,它就会消失,故事结束。 Primefaces 开了一张票,他们关闭了它,因为无法修复,因为 Flash 组件不应该使用 ajax 更新。

所以当我提交表单时,除非逻辑成功,否则我需要单独留下验证码。如果逻辑成功,我需要确保验证码从屏幕上消失。最简单、最干净的方法是什么?

对不起,如果这是一个 n00b 问题。我对 Primefaces 和 JSF 真的很陌生。

【问题讨论】:

    标签: ajax jsf primefaces


    【解决方案1】:
    RequestContext.getCurrentInstance().update("clientId")
    

    帮助有条件的更新。

    重新验证尝试

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

    【讨论】:

    • 从 Primefaces 7 开始,RequestContext.getCurrentInstance() 不可用,而应使用PrimeFaces.current().ajax()
    【解决方案2】:

    您可以结合使用 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 中。谢谢!
    【解决方案3】:

    您可以在支持 bean 中使用一个变量,并在 xhtml 部分使用它。
    像这样:

    update="#{backingMB.updateString}"
    

    所以,在条件之后你可以把updateString的值,但是当你在backingMB上定义它时,你需要把它写成:

    String updateString=""; // this will be id of the component to be updated  
    

    这样您就不会收到NullPointerException

    【讨论】:

    • 我正在尝试这个......如何在表单提交时“更新”updateString(即选择OK按钮)?我所做的是检查错误,如果一切正常,则关闭对话框并更新父级,如果出现错误,则未关闭对话框并更新对话框消息部分。但是,在确定时,我的表单已提交并且 updateString 未更新。
    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2013-05-11
    相关资源
    最近更新 更多