2013-05-03 11 views
5

複数のajaxイベントの順次処理のサポートされているJSF 2.x機能が動作しません。 私は次のシナリオ得た:両方の要素のイベントがあるのcommandButton(ACTION)JSF ajaxイベント・キューがchange-event後のaction-eventで機能しない

<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> 

  1. 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> 
    
  2. 時間それが自分自身で引き起こされた場合、正しく処理されます。

    1回のクリックで両方のイベントが発生したときに問題が発生します(textInputの値を入力してからボタンをクリックしてください)。私はこの2つのアヤックス要求が同期的に発生することを期待していました(CHANGE-TextFieldとACTION-commandButton)。

    不幸にも、1つのAjax-Request(Change-TextField)しかありません.2番目のイベントは完全に失われているようです。ここで指摘したように、commandButtonの完全な満たされている: commandButton/commandLink/ajax action/listener method not invoked or input value not updated

    私はこの問題を解決する方法上の任意のヒントを得るために感謝

    私はすでに時間のためのすべての前提条件があることを確実にしました。

    環境: Glassfishの3、クロサギ科2.1.3-FCS

+0

興味深い...簡単に複製された小さなアプリケーションでこれを確認しましたか? MyFacesのためにMojarraを交換し、同じ動作をするかどうかを確認することは可能ですか? –

+0

2人の(アクション)リスナーが発砲して*予想される*動作をしたことがありますか? – skuntsel

+0

あなたは解決策を見つけましたか?私は同じ問題に直面しています。 –

答えて

3

JSF AJAX呼び出しは非同期です。この場合、<h:inputText>onchangeイベントによって生成された1つのAJAX要求を送信しても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更新は行われませんでした。どこかの競争条件があるはずです。それは大きな問題であり、さらに調査する必要があります。

これはおそらく答えではありませんが(当初考えていましたが)、テストケースの命題です。そして、私はこの動作が非常にまれであるという事実にもかかわらず、実際の使用例であり、何が起こっているのか十分に理解する価値があります。

0

最初のおかげで、すばやく洗練された返信が得られました。

最初から2番目のテストでは、ajaxイベントが適切にキューに入れられていることが指摘されています。

再び、上記のより複雑なシナリオを確認しました。スキップされたイベントシームの原因は、「ビジーオーバーレイ」に関連しています。フォーム要素を無効にし、長いランニングajax要求の際にオーバーレイを適用するJavaScriptの束と考えることができます。これは、jsf.ajax.addOnEventコールバックを適用することによって行われます。

とにかく、いくつかのコントロールを無効にしても、「成功」後にフォームが適切な状態にあり、2番目のイベントを処理することができます。

現在、私は、一時的に無効になっているボタンが、その後に実行されるべき関連するアクションイベントを妥協すると仮定します。

私たちは現在、問題を分析しており、私は最終結果をできるだけ早く投稿します。

+0

解決策は見つかりましたか?私はこれがかなり戻って投稿された知っているが、私は同じ問題に直面している。私は、 "ビジーオーバーレイ"を削除したり、それを遅らせることなく解決策を見つけることができません。 –

関連する問題