更改事件后,JSF ajax事件队列对action-event不起作用

前端之家收集整理的这篇文章主要介绍了更改事件后,JSF ajax事件队列对action-event不起作用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
支持的JSF 2.x顺序处理多个ajax事件的功能对我来说不起作用.
我有以下场景:

> h:inputText(CHANGE)

<h:inputText id="consumption_input"
   value="#{cc.attrs.consumptionInfo.consumption}">
  <f:ajax
     render="#{cc.attrs.outerRenderString}"
     event="change" listener="#{cc.handleAjaxRequest}" />
</h:inputText>

> h:commandButton(ACTION)

<h:commandButton
    id="startComparisonButton"
    action="#{rateComparisonBean.startRateComparison()}"
    value="#{bundle.rateResultOverview_startComparison}">
    <!-- This is to avoid mixed requests,ajax and full requests -->
       <f:ajax render="@form"/>
    </h:commandButton>

如果它们自己触发,则两个元素的事件都会被正确处理.

在一次单击中触发两个事件时出现问题(在textInput中输入值,然后单击按钮).我预计这导致两个同步触发的ajax请求(CHANGE-TextField和ACTION-commandButton).

不幸的是,只有一个Ajax-Request(Change-TextField),第二个事件似乎完全丢失了.

我已经确保h:commandButton的所有前置条件都已满,如下所示:
commandButton/commandLink/ajax action/listener method not invoked or input value not updated

我很高兴得到任何关于如何解决这个问题的提示.

环境:
Glassfish 3,Mojarra 2.1.3-FCS

解决方法

JSF AJAX调用是异步的.发送一个AJAX请求,在这种情况下由< h:inputText>生成onchange事件,不会阻止JavaScipt继续执行,在这种情况下,触发提交按钮单击,这反过来触发另一个AJAX请求.尽管如此,AJAX请求确实在客户端排队,按照发送的确切顺序进行处理,这由 JSF 2.0 specification第13.3.2章保证.

以下是我的测试用例:

风景:

<h:form id="form">
    <h:inputText id="text" value="#{q16363737Bean.text1}">
        <f:ajax render="text2" event="change" listener="#{q16363737Bean.ajaxListenerText}"/>
    </h:inputText>
    <h:commandButton id="button" action="#{q16363737Bean.actionButton}" value="Submit">
        <f:ajax render="text1 text3" listener="#{q16363737Bean.ajaxListenerButton}"/>
    </h:commandButton>
    <br/>
    <h:outputText id="text1" value="Text 1: #{q16363737Bean.text1}."/>
    <h:outputText id="text2" value="Text 2: #{q16363737Bean.text2}."/>
    <h:outputText id="text3" value="Text 3: #{q16363737Bean.text3}."/>
</h:form>

豆子:

@ManagedBean
@ViewScoped
public class Q16363737Bean implements Serializable {

    private String text1 = "I'm text 1";//getter + setter
    private String text2 = "I'm text 2";//getter + setter
    private String text3 = "I'm text 3";//getter + setter

    public void ajaxListenerText(AjaxBehaviorEvent abe) {
        text2 = "I was modified after inputText AJAX call";
    }

    public void ajaxListenerButton(AjaxBehaviorEvent abe) {
        text1 = "I was modified after AJAX listener call of commandButton";
    }

    public void actionButton() {
        text3 = "I was modified after commandButton AJAX call";
    }

}

在检查了一段时间之后,我确实发现很少有人吞下命令按钮的AJAX调用,也没有完成UI更新.似乎某处应该有一些竞争条件.这是一个很好的问题,需要进一步调查.

所以,这可能不是一个答案(虽然我认为它最初是),而是一个测试用例的命题.尽管事实上我很少遇到这种行为,但这是一个真实的用例,值得完全理解正在发生的事情.

猜你在找的Ajax相关文章