【问题标题】:Mixing Ajax and full requests in JSF 2.0在 JSF 2.0 中混合 Ajax 和完整请求
【发布时间】:2011-03-10 16:44:50
【问题描述】:

给我带来问题的 JSF 代码如下:

<h:panelGrid columns="3">
          <!-- Minimum Password Length -->
          <h:outputText value="#{i18n['xxx']}:" />
                        <h:inputText id="minLength"
                                     value="#{passwordPolicies.minLength.paramValue}"
                                     required="true">
                            <f:validateLongRange minimum="1"/>
                            <f:ajax event="valueChange"
                                    render="@this minLengthMessage"
                                    listener="passwordPolicies.testListener"/>
                        </h:inputText>
                        <h:message id="minLengthMessage"
                                   for="minLength"
                                   errorClass="error"
                                   tooltip="true"/-->
                <!-- Many other validation fields -->
<h:panelGrid/>

首先,我遇到了一个非常相似的问题:f:ajax listener never fired。我必须在我的 JSF 页面上结合 Ajax 和完整请求。 Jim Driscoll @ java.net 说为了让这两个工作,必须设置一个 Ajax 错误侦听器?这与 ajax 标签的 listener 属性有很大不同吗?

现在,我知道我可以尝试 Primefaces p:inputText 和 p:ajax 标记,但这些需要我为所有经过验证的字段提供单独的侦听器。有没有办法修复 f:ajax 错误侦听器,以便被触发并且不讨厌:

感谢您的任何意见!

【问题讨论】:

  • 当您只选择字段时,通常不会发生这种情况。代码没有给出任何东西,而且监听器也没有正确绑定,这会产生不同的异常。你什么时候得到这个错误?当你按下非 Ajax 命令按钮时?
  • 嗨,是的,它发生在我按下非 Ajax 按钮时,它是随机发生的,例如当竞争条件导致 Jim Driscoll 在我发布的链接中提到的两个原因发生时。
  • Jim 告诉在命令按钮中使用&lt;f:ajax&gt; 来解决此问题。侦听器不是强制性的,它们只是说明竞争条件的示例。

标签: java ajax jsf jsf-2 listener


【解决方案1】:

你需要让你的命令按钮来触发一个 ajax 请求。

<h:commandButton value="Submit" action="#{bean.submit}">
    <f:ajax execute="@form" render="@form" />
</h:commandButton>

那些&lt;f:ajax&gt; 监听器不是强制性的。它们只是在 Jim 的文章中用作示例来说明竞争条件。哪个首先被调用?显然你想先调用监听器。

this tutorialthis chapter 中可以找到几乎相同类型的实际示例。仅使用blur 而不是valueChange,因为当您模糊保持为空的required="true" 字段时不会调用valueChange,这将导致“需要值”消息永远不会出现这样的领域。

【讨论】:

  • 我还有一个问题,如果 commandButton 操作将我带到另一个 JSF 页面,您在此处发布的代码 sn-p 是否必要?逻辑上对我来说不是,但仍然想避免我之前遇到的错误。非常感谢!
  • 让它发送重定向。 return "outcome?faces-redirect=true";.
  • 当问题仅在我们单击按钮时这是一个很好的解决方案,但是如果用户单击链接,我该怎么办?单击链接会触发完整的请求,同时会出现模糊。
【解决方案2】:

这里只是为了后代记录,但在 JavaScript 中创建一个错误处理程序,然后从 f:ajax 标记引用它会抑制错误警报,并导致您的错误处理程序被错误消息调用。问题中提到的 Jim Driscoll 的文章中描述了这种行为,但没有具体说明。我已经验证它有效:

function onAjaxError( error ) { console.log( error.description ); }

&lt;f:ajax onerror="onAjaxError" ...&gt;

【讨论】:

    【解决方案3】:

    如果你想添加一些监视器,方法如下:

    <h:commandButton value="Submit"  action="#{yourBean.YourAction}" render="thisIsWhereYouWantToDisplay">
    <f:ajax onevent="monitor" execute="@form" render="@form" />
                                            </h:commandButton>
    

    【讨论】:

    • 我无法理解这是对问题的回答
    猜你喜欢
    • 2011-12-27
    • 2011-12-09
    • 2011-11-17
    • 2012-05-18
    • 1970-01-01
    • 2017-05-25
    • 2014-07-25
    • 2011-02-27
    相关资源
    最近更新 更多