2016-10-15 1 views
1

私は非常に奇妙な振る舞いに遭遇しましたBootstrap Dialog 何らかの理由で、下記のfoo機能でダイアログボックスが一度に表示されません。描画は、$.get(...に達する瞬間まで遅れています。これがどうして起こるのでしょうか? Maximusのanwserに触発さブートストラップダイアログレンダリングポストポケット

function = foo() 
{ 
    $rows.each(function (i, row) 
    { 
     var $row = $(row); 
     if (something_is_wrong()) 
     { 
      alert_error('Something is wrong', $form, ''); 
      return; 
     } 
     // Some other code   
    }); 
    // The Bootstrap modal dialog shows up when reaching the point below !!! 
    $.get('/sending_order_notification/' + legal_entity_own_id, function(response) 
    { 
     BootstrapDialog.show({ ... 
     // ... 
    }); 
} 


function alert_error(message, $current_form, function_name) 
{ 
    if ($current_form != undefined) 
     $current_form.modal('hide'); 

    BootstrapDialog.show(
    { 
     type: BootstrapDialog.TYPE_DANGER, 
     title: 'Ошибка', 
     message: message, 
     draggable: true, 
     buttons: [{ 
      label: 'OK', 
      action: function(dialogItself) { 
       dialogItself.close(); 
       if (function_name != undefined) 
        $.post('/send_error_report/', function_name); 
      } 
     }] 
    }); 
} 

UPDATE 、私は私のために働いていた以下の回避策を選びました。しかし、これはクリーンな解決策ではありません。なぜなら、ループが無意味になってもループを続ける必要があるからです。

function = foo() 
    { 
     var bad_condition_flg = false; 
     $rows.each(function (i, row) 
     { 
      var $row = $(row); 
      if (something_is_wrong()) 
      { 
       bad_condition_flg = true; 
      } 
      // Some other code   
     }); 
     if (bad_condition_flg); 
     { 
      alert_errr(...); 
      return; 
     } 
    } 
+0

どのようにその時点で表示されていることをご存知ですか?あなたはデバッガを使いますか? 'alert_error'が呼び出されていますか? –

+0

はい、私はデバッガを使用しています。そして!!!最も驚くべきことに、fooは 'return'に到達すると停止しません! –

+0

'title: 'Ошибка'、' - russian language :) –

答えて

1

ダイアログが表示されるためには、ブラウザは再描画を実行する必要があります。 Repaintは、コールスタックに何もないときにのみ可能です。したがって、ダイアログはfooの実行が終了した後にのみ表示されます。 時にはがブレークポイントで停止すると、ブラウザの再描画時間が与えられ、呼び出しスタックが空になる前にダイアログが表示される可能性があるため、デバッガを使用すると少し異なります。

+0

ループの前に 'var stop = false'をつける方法があります。条件が成立した後、ループの後に終了する必要があるかどうかを確認しますが、悪い条件が1回満たされても前方にループするのは意味をなさないからです。 JSでループを止めることはできないのですか? –

+0

@EdgarNavasardyan、私はあなたが話している解決策を本当に理解していない...それは何の解決策ですか?質問では、 'BootstrapDialog.show('が呼び出された直後にダイアログが表示されない理由を尋ねました。 –