ajax - JSF ajax 事件队列在更改事件后对 Action 事件不起作用

标签 ajax jsf jsf-2 commandbutton

多个 ajax 事件的顺序处理的受支持 JSF 2.x 功能对我不起作用。
我得到了以下场景:

  • h:inputText (改变)
    <h:inputText id="consumption_input"
       value="#{cc.attrs.consumptionInfo.consumption}">
      <f:ajax
         render="#{cc.attrs.outerRenderString}"
         event="change" listener="#{cc.handleAjaxRequest}" />
    </h:inputText>
    
  • h:命令按钮( 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>
    

    bean :
    @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 - JSF ajax 事件队列在更改事件后对 Action 事件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16363737/

    相关文章:

    ajax - 如何使用 PrimeFaces p :droppable inside datatable?

    javascript - 当组件可见时如何触发事件。必须是独立的

    java - EL 中整数除法的字符串表示形式(未截断)?

    java - 如何格式化 jsf 2.0 <f :selectItems/> with date value from List

    javascript - Ajax函数进入循环

    javascript - 类型错误:处理程序未定义

    javascript - Wordpress ajax 调用返回整个 html 页面

    jQuery Ajax 局部 View 只工作一次

    validation - JSF:根据验证成功或失败有条件地更新

    java - 将外部库添加到基于 Maven 的 JSF 项目的正确方法