проблема в проверке Bootstrap 4 на поле выбора - PullRequest
3 голосов
/ 24 сентября 2019

Я новичок в jQuery и Bootstrap, я использую jquery и Bootstrap 4 для проверки модальности моей формы, когда возникает ошибка, она должна показывать ошибку ниже соответствующих полей, но в моем случае поле выбора получаетперезаписывается ошибкой и поле выбора исчезает, но оно отлично работает для поля ввода.

здесь посмотрите, и если вы хотите посмотреть на изображение, просто нажмите на него ..

error

Как вы можете видеть, поля выбора перезаписываются fieldError, но это нормально для поля ввода.

вот мой код проверки jQuery:

$(function(){
    setCategorySelect();

    $(document).on('shown.bs.modal','#manageItemsModal', function () {
        $('#manageItemsModal #btnSubmit').on('click', function(){
            if (validateForm()) {
                messageSuccess("Very well");
            } else {
                messageError("Oops!!");
            }
        });
    });
});

function validateForm() {
    var validationStatus = true;

    if ($('#manageItemsForm #selectedCategory').val().length == 0) {
        showFieldError(('#manageItemsForm #selectedCategory'), 'Must not be blank');
        if (validationStatus) { $('#manageItemsForm #selectedCategory').focus() };
        validationStatus = false;
    }

    if ($('#manageItemsForm #selectedBrandModel').val().length == 0) {
        showFieldError(('#manageItemsForm #selectedBrandModel'), 'Must not be blank');
        if (validationStatus) { $('#manageItemsForm #selectedBrandModel').focus() };
        validationStatus = false;       
    }

    if ($('#manageItemsForm #serialNo').val().length == 0) {
        showFieldError(('#manageItemsForm #serialNo'), 'Must not be blank');
        if (validationStatus) { $('#manageItemsForm #serialNo').focus() };
        validationStatus = false;       
    }

    if ($('#manageItemsForm #selectedVendor').val().length == 0) {
        showFieldError(('#manageItemsForm #selectedVendor'), 'Must not be blank');
        if (validationStatus) { $('#manageItemsForm #selectedVendor').focus() };
        validationStatus = false;       
    }

    if ($('#manageItemsForm #selectedBranch').val().length == 0) {
        showFieldError(('#manageItemsForm #selectedBranch'), 'Must not be blank');
        if (validationStatus) { $('#manageItemsForm #selectedBranch').focus() };
        validationStatus = false;       
    }   

    return validationStatus;    
}

function showFieldError(element, message) {
    $(element).addClass('is-invalid');
    $(element).next().html(message);
    $(element).next().show();
}

function clearFieldError(element) {
    $(element).removeClass('is-invalid');
    $(element).removeAttr('required');
    $(element).next().html('');
}

function setCategorySelect() {
    var $categorySelect = $('#manageItemsForm #selectedCategory').selectize({
        selectOnTab: true,
        closeAfterSelect: true,
        persist: false,
        create: false,
        valueField: 'id',
        labelField: 'text',
        options: [],
        preload: true,
        onInitialize : function() {
            var self = this;
            $.ajax({
                url: '/assetCategory/search',
                type: 'POST',
                dataType: 'json',
                data: {
                    searchText: '*'
                },                  
                error: function() {
                    callback();
                },
                success: function(res) {
                    self.addOption(res.data);
                }
            });
        },
        load: function(query, callback) {
            if (query.length <= 2) return callback();
            $.ajax({
                url: '/assetCategory/search',
                type: 'POST',
                dataType: 'json',
                data: {
                    searchText: query + "*"
                },
                error: function() {
                    callback();
                },
                success: function(res) {
                    console.log(res.data);
                    callback(res.data);
                    $categorySelect.refreshItems();
                },
                fail : function() {
                    callback();
                }
            });   
        }
    });         
}

вот мой HTML:

<div class="modal-body">
    <form id="manageItemsForm">
         <input type="hidden" id="id" name="id">
              <div class="row">
                  <div class="col-4">
                    <div class="form-group">
                       <label for="selectedCategory" class="col-form-label"><span class="text-danger">* </span>Category</label>
                            <select class="form-control" name="selectedCategory" id="selectedCategory"></select>    
                     <div class="invalid-feedback"></div>
                    </div>
                   </div>
                    <div class="col-8">
                        <div class="form-group">
                            <label for="selectedBrandModel" class="col-form-label"><span class="text-danger">* </span>Brand & Model</label>
                                <select class="form-control" name="selectedBrandModel" id="selectedBrandModel"></select>
                                    <div class="invalid-feedback"></div>
                         </div>                         
                    </div>
               </div>
               <div class="row">
                   <div class="col-4">
                        <div class="form-group">
                            <label for="serialNo" class="col-form-label"><span class="text-danger">* </span>Serial No.</label>
                                  <input type="text" class="form-control" id="serialNo" name="serialNo">
                                    <div class="invalid-feedback"></div>
                        </div>
                    </div>
                    <div class="col-8">
                       <div class="form-group">
                           <label for="description" class="col-form-label">Description</label>
                               <input type="text" class="form-control" id="description" name="description">
                                    <div class="invalid-feedback"></div>
                        </div>                          
                    </div>
               </div> 
               <div class="row">
                   <div class="col-6">
                       <div class="form-group">
                          <label for="selectedVendor" class="col-form-label"><span class="text-danger">* </span>Purchase Vendor</label>
                              <select class="form-control" name="selectedVendor" id="selectedVendor"></select>  
                                    <div class="invalid-feedback"></div>                                
                    </div>
               </div>
               <div class="col-3">
                   <div class="form-group">
                       <label for="selectedVendor" class="col-form-label"><span class="text-danger">* </span>Purchase Date</label>
                            <div class="input-group date" data-date-format="dd-M-yyyy">
                                 <input type="text" class="form-control" id="purchaseDate" name="purchaseDate" />
                                        <span class="input-group-text input-group-append input-group-addon"><i class="simple-icon-calendar"></i></span>
                                    </div>
                            <div class="invalid-feedback"></div>                                
                    </div>
                </div>
                <div class="col-3">
                    <div class="form-group">
                        <label for="supportTillDate" class="col-form-label"><span class="text-danger">* </span>Support till date</label>
                            <div class="input-group date" data-date-format="dd-M-yyyy">
                               <input type="text" class="form-control" id="supportTillDate" name="supportTillDate" />
                                        <span class="input-group-text input-group-append input-group-addon"><i class="simple-icon-calendar"></i></span>
                          </div>
                          <div class="invalid-feedback"></div>                              
                    </div>
               </div>                                                       
           </div>
           <div class="row">
              <div class="col-9">
                  <div class="form-group">
                     <label for="selectedBranch" class="col-form-label"><span class="text-danger">* </span>Branch</label>
                            <select class="form-control" name="selectedBranch" id="selectedBranch"></select>    
                                <div class="invalid-feedback"></div>
                    </div>  
               </div>
               <div class="col-3">
                   <label for="purchasePrice" class="col-form-label">Purchase Price</label>
                        <div class="input-group">
                            <div class="input-group-prepend"><span class="input-group-text input-group-addon" style="padding: 0.4rem 0.75rem 0.3rem 0.75rem;">&#8377;</span></div>
                            <input id="purchasePrice" name="purchasePrice" type="text" class="form-control" aria-label="Amount" style="text-align:right;">
                                </div>
                                <div class="invalid-feedback"></div>
                            </div>                          
                        </div>  
                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                    <button id="btnSubmit" type="button" class="btn btn-primary">Save</button>
                </div>
            </div>

Кстати, я использую jQuery в загрузке Spring, и все работает нормально (сохранение, обновление, удаление), за исключением проверки из jQuery.

Пожалуйста, помогите !!

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Я не вижу рабочий код, потому что вы используете некоторые внешние ссылки, такие как selectize.

Я предлагаю вам привыкнуть к "фрагментам" для предоставления кода.

Кстати, ваша проблема, похоже, связана со стилями.Я не могу знать, но моя ставка заключается в том, что вам просто нужно предоставить стиль CSS для

.select::after.error {
color:red;
}

Вы можете проверять и копировать код CSS.

1 голос
/ 25 сентября 2019

Проблема в вашем HTML, узлы вашей .input-группы не всегда имеют одинаковую структуру.В некоторых случаях у вас есть .invalid-feedback сразу после ввода, такой как этот HTML

<div class="form-group">
  <label for="serialNo" class="col-form-label"><span class="text-danger">* 
  </span>Serial No.</label>
  <input type="text" class="form-control" id="serialNo" name="serialNo">
  <div class="invalid-feedback"></div>
</div>

Для других полей .invalid-feedback не после ввода, а вне .form-group.взгляните

<div class="input-group date" data-date-format="dd-M-yyyy">
   <input type="text" class="form-control" id="purchaseDate" name="purchaseDate" />
   <span class="input-group-text input-group-append input-group-addon">
       <i class="simple-icon-calendar"></i>
   </span>
 </div>
 <div class="invalid-feedback"></div>

Это различие в структуре HTML формы сделало ваши showFieldError () и clearFieldError () не всегда так, как вы ожидали, потому что $(element).next() не перехватывает нужный DOM-узел для вставки/ удалить сообщение проверки.Поэтому в некоторых случаях clearFieldError удаляет неправильный HTML-тег, и это может привести к тому, что ваши выборки исчезнут

function showFieldError(element, message) {
    $(element).addClass('is-invalid');
    $(element).next().html(message);
    $(element).next().show();
}

function clearFieldError(element) {
    $(element).removeClass('is-invalid');
    $(element).removeAttr('required');
    $(element).next().html('');
}

Так что вам нужно исправить свой HTML, чтобы получить одинаковую структуру для всех полей.Поместите <div class="invalid-feedback"></div> всегда чуть ниже поля выбора или ввода.В противном случае вам нужно изменить селектор, который вы передаете функциям showFieldError () и clearFieldError (), в соответствии с вашим HTML

В противном случае простой подход - добавить идентификатор в div с классом .invalid-feedback, идентификатор, которыйвы можете легко управлять по его связанному идентификатору ввода, что-то вроде

<div class="input-group date" data-date-format="dd-M-yyyy">
       <input type="text" class="form-control" id="purchaseDate" name="purchaseDate" />
       <span class="input-group-text input-group-append input-group-addon">
           <i class="simple-icon-calendar"></i>
       </span>
     </div>
     <div id="purchaseDate_err_mex" class="invalid-feedback"></div>

, таким образом вы можете передать имя ввода вашим функциям, и они станут

    function showFieldError(input_id, message) {
        $('#'+input_id).addClass('is-invalid');
        $('#'+ input_id +'_err_mex').html(message).show();
    }

    function clearFieldError(input_id) {
        $('#'+input_id).removeClass('is-invalid');
        //$('#'+input_id).removeAttr('required'); 
       /* don't need to remove required attribute from mandatory fields */
        $('#'+ input_name +'_err_mex').html('').hide();
    }

и функцией проверки

function validateForm() {
    var validationStatus = true;

    if ($('#selectedCategory').val().length == 0) {
        showFieldError('selectedCategory', 'Must not be blank');
        if (validationStatus) { $('#selectedCategory').focus() };
        validationStatus = false;
    }

 ........

    return validationStatus;    
}

Вы только проверяете, является ли длина всех полей больше 0, поэтому вы можете проверить всю форму внутри цикла

function validateForm() {
        var validationStatus = true;
        var form_inputs = $('#manageItemsForm input, #manageItemsForm select')


        $.each(form_inputs,function(){

            var input_id = $(this).attr('name');
            clearFieldError(input_id);
            if ($.trim($(this).val()).length == 0 && $(this).is("[required]")) {
                showFieldError(input_id, 'Must not be blank');
                if (validationStatus) { $('#'+input_id).focus() };
                validationStatus = false;
            }
        });

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