2017-06-13 10 views
0

私はWicketを使用するWebアプリケーションを持っています。私の問題は次のとおりです。 AjaxRequestTargetの内部で実行されるコードの一部が長時間費やされています。この操作中にビジーインジケータを表示する必要があります。要求を処理します。Wicket Call Javascript関数AjaxRequestTarget内

私はtarget.appendJavascript( "jsfunction()"を使用しようとしましたが、メソッドの実行後に起動されるため動作しません。この目標を達成するにはどうすればよいですか?

私のコード例では、マーティン-Gが提供する以下の

final ConfirmModal del_modal = new ConfirmModal("del-btn", "Are you sure?") { 
     @Override 
     public void onClickOK(AjaxRequestTarget target) { 

      target.appendJavaScript("loadingFormFromTarget();"); 

      try { 
       Thread.sleep(10000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(ListPricePlanPage.class.getName()).log(Level.SEVERE, null, ex); 
      }}} 

UPDATE

ソリューションはAjaxLinkで正常に動作しているが、私の問題はより複雑です。私は、ModalWindoを拡張ConfirmModalを持って、この実装で パブリック抽象クラスConfirmModalPanelはパネル{

public ConfirmModalPanel(String id, String text) { 
    super(id); 

    add(new Label("text", text)); 

    AjaxLink ok = new AjaxLink("ok") { 
     @Override 
     public void onClick(AjaxRequestTarget target) { 
      onClikOK(target); 
     } 

     @Override 
     protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { 
      super.updateAjaxAttributes(attributes); 
      attributes.getAjaxCallListeners().add(new AjaxCallListener().onBeforeSend("start();").onComplete("finish();")); 
     } 
    }; 



    add(ok); 

    add(new AjaxLink("ko") { 
     @Override 
     public void onClick(AjaxRequestTarget target 
     ) { 
      onClikKO(target); 
     } 
    } 
    ); 



} 

abstract public void onClikOK(AjaxRequestTarget target); 

abstract public void onClikKO(AjaxRequestTarget target 
); 

}

を拡張機能は、「開始()」と「仕上げ()は、」正しく呼び出されますが、 onClickOKメソッド内で要求書込みを実行し続けると、ビジーインジケータを表示できません。

答えて

1

onClickOk()でこれを行うのは遅すぎます。要求が完了すると、Web応答に書き込まれたものはすべてブラウザに送信されます。

AjaxCallListener#onBeforeSend()onComplete()を使用する必要があります。これらは、要求を行う直前および応答を受け取った後にクライアント側で実行されます。

たとえば、https://github.com/l0rdn1kk0n/wicket-bootstrap/blob/73a3d62a17c12cbca60d6b54caeee6b99ffbe9a8/bootstrap-extensions/src/main/java/de/agilecoders/wicket/extensions/markup/html/bootstrap/ladda/LaddaAjaxLink.java#L101およびhttps://github.com/l0rdn1kk0n/wicket-bootstrap/blob/73a3d62a17c12cbca60d6b54caeee6b99ffbe9a8/bootstrap-extensions/src/main/java/de/agilecoders/wicket/extensions/markup/html/bootstrap/ladda/LaddaAjaxCallListener.java#L15-L16を参照してください。

+0

この解決策はAjaxLinkでは正常に動作しますが、私の場合は問題ありません。私は説明を更新しました。 –

+0

インジケータを 'start()'に表示し、それを 'finish()'に隠す必要があります。考え方は、サーバー側に要求を行う前にそれを表示することです。あなたは 'setTimeout(...)'を使ってそれを少し遅らせて表示することができます。その場合は、 'finish()'でも 'clearTimeout()'を使わなければなりません。 –

+0

私はあなたの助けを得て解決しましたが、私はこの方法でソリューションを修正します。私はAJaxCallListener:onSendBeforeを使用してupdateAjaxAttributesを介してsetTimeoutイベントを発生させ、onClickOkメソッド内でtarget.appendJavascript( "finish()")メソッドでイベントfinish()を発生させます。これは正常に動作します。 –

関連する問題