Как предотвратить отправку формы с проверкой AJAX - PullRequest
0 голосов
/ 02 января 2019

Как запретить отправку формы, когда я использую ajax для ее проверки. Проблема в том, что ajax является асинхронным, а реальный результат (в моем случае false) приходит позже. Правильно ли делать Ajax до sync? Это мой кусок кода:

$('#w0').on('beforeSubmit', function(e){
        let loadDate = $('#dstrequest-load_date').val()
        let shippingDate = $('#dstrequest-shipping_date').val()
        let requestId = '".($model->isNewRecord ? 0 : $model->id)."'
        let trucks = $('.container-items_truck').find('.truck-item')
        let ids = []
        let result = true
        $.each(trucks, function(){
            let id = $(this).find('select').first().val()
            if(ids.indexOf(id) === -1)
                ids.push(id)
        })
        $.ajax({
            method: 'post',
            url: '/erp/distribution/dst-vehicle/check-truck-engage-date',
            data: {
                load_date: loadDate,
                shipping_date: shippingDate,
                trucks: ids,
                request_id: requestId
            }
        })
        .done(function(data){
            let selects = $('select[name$=\"[truck_id]\"]')
            $.each(selects, function(){
                let val = $(this).val()
                if(data.indexOf(val) !== -1){
                    $('#w0').yiiActiveForm('updateAttribute', $(this).attr('id'), ['".Yii::t('distribution', 'distributionCore.busy_truck')."'])
                    result = false
                }                   
            })
        })
        .always(function(data){
            let transfer_wrapper = $('.transfer-wrapper')
            $.each(transfer_wrapper, function(){
                if($(this).is(':visible')){
                    let fields = $(this).find('input, select')
                    $.each(fields, function(){                  
                        if($(this).val() == ''){
                            let id = $(this).attr('id')
                            $('#w0').yiiActiveForm('updateAttribute', id, ['" . Yii::t('distribution', 'distributionCore.please_fill_the_field') . "'])
                            result = false
                        }
                    })   
                }
            })      
        })
        // HERE THE RESULT SHOULD BE FALSE BECAUSE OF THE AJAX VALIDATION BUT IT'S TRUE BECAUSE OF THE ASYNC BEHAVIOUR.
        return result
    })

1 Ответ

0 голосов
/ 02 января 2019

Правильно ли выполнять синхронизацию Ajax?

Нет.Синхронные HTTP-запросы от JS устарели.Никогда не используйте их.

Вам необходимо либо:

Всегда останавливать

Всегда препятствовать нормальной отправке формы.

После того, как вы проверили ввод, используя Ajax, используйте JS для повторной отправки формы (без повторной проверки).

Предварительная проверка

Выполните проверку данныхвведено, поле за полем.

Надеемся, что Ajax будет завершен к тому времени, когда будет заполнено последнее поле и отправлена ​​форма.

Это на тот момент, если Ajax не завершенвы должны либо рискнуть отправить форму, не зная результата проверки Ajax, либо вернуться к первому предложенному мною варианту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...