1

Bootstrap Dialogの非常に奇妙な動作に遭遇しました 。何らかの理由で、foo以下に示す関数で、Dialog ボックスがすぐに表示されません。レンダリングは、ラインに到達するまで遅延されます$.get(...。なぜこれが起こるのでしょうか?

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;
         }
     }
4

1 に答える 1

1

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

于 2016-10-15T10:23:57.193 に答える