ajax работает более одного раза в модале? - PullRequest
1 голос
/ 16 января 2020

Я разрабатываю функцию, для которой требуется запрос Ajax. Сначала я открываю модальное окно, нажимая кнопку с классом '.open-email-modal'. И после этого он открывает модальное поле, в котором имеется 2 поля для ввода значений для регистра, а под ним - таблица. При первом открытии модального режима все происходит нормально, регистр с вызовом запроса Ajax проходит через контроллер и возвращает в ответ значение, зарегистрированное в соответствующем токене. Ниже приведены коды, которые я разработал. (Я использую Laravel).

Это модальный код.

<div class="col-md-4">

    <div class="modal fade" id="emailModal" tabindex="-1" role="dialog" aria-labelledby="modal-form" aria-hidden="true">
  <div class="modal-dialog modal- modal-dialog-centered modal-lg" role="document">
      <div class="modal-content">

          <div class="modal-body p-0">


<div class="card bg-secondary shadow border-0">
  <div class="card-header bg-transparent pb-4">
      <div class="text-muted text-center mt-2 mb-3 text-uppercase"><h1>Adicionar Email</h1></div>
        <div class="text-center text-muted mb-4">
            <small> Preencha os campos dos emails </small>
        </div>
  </div>
  <div class="card-body px-lg-5 py-lg-5">
  <form  id="emailModalProspect" method="post" action="{{ route('prospectEmails.store') }}">

          @csrf
          {{ method_field('post') }}


          <input hidden name="prospect_id" id="prospect_id_email" type="text">

          <div class="form-group mb-3">
            <label class="form-control-label" for="prospect-email-name">{{ __('Nome') }}</label>
              <div class="input-group input-group-alternative">
                  <div class="input-group-prepend">
                      <span class="input-group-text"><i class="fas fa-user"></i></span>
                  </div>
                  <input class="form-control" id="prospect-email-name" name="name" placeholder="Digite o nome do proprietário do email" type="text" required>

              </div>
          </div>

          <div class="form-group mb-3">
              <label class="form-control-label" for="prospect-email-email">{{ __('Email') }}</label>
              <div class="input-group input-group-alternative">
                  <div class="input-group-prepend">
                      <span class="input-group-text"><i class="ni ni-email-83"></i></span>
                  </div>
                  <input class="form-control" id="prospect-email-email" name="email" placeholder="Digite o email da empresa/cliente" type="email">
              </div>
          </div>

          <div class="text-center">
              <button type="submit" id="save-email" class="btn btn-primary my-4 store-email text-uppercase">Cadastrar email</button>
          </div>

    </form>

          <div class="table-responsive ">

            <table class="table align-items-center table-flush  tablesorter-dropbox text-center" id="prospect-email-table">
                <thead class="thead-light text-center" >
                    <tr class="text-center">
                        <th scope="col" class="text-center col-sm-2"><b>{{ __('Nome') }}</b></th>
                        <th scope="col" class="text-center col-sm-2"><b>{{ __('Email') }}</b></th>
                        <th scope="col" class="text-center col-sm-2"><b>{{ __('Opção') }}</b></th>
                    </tr>
                </thead>
                <tbody class="text-center" id="received-emails">
                </tbody>
            </table>
        </div>

        <div class="text-center">
              <button type="button" class="btn btn-default my-4 text-uppercase" data-dismiss="modal">Fechar</button>
          </div>


  </div>
</div>
</div>
</div>
</div>
</div>
</div> 

Это код в JQuery, где он вызывает запрос Ajax.

 $('.open-email-modal').on('click', function(e) {
       e.preventDefault();
       e.stopPropagation();

       $.ajaxSetup({
         headers: {
           'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          }
        });

        let p = JSON.parse($(this).attr('data-entity'));

        let modal = $('#emailModal');
        let form = $('#emailModalProspect');

        $('#prospect_id_email').val(p.id).change();

        $('.store-email').on('click', function(b){
          b.stopPropagation();
          b.preventDefault();

          $.ajaxSetup({
            headers: {
              'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
          });

          let url = '{{route("prospectEmails.store")}}';

          $.ajax({
            url: url,
            type: "POST",
            data : form.serialize(),
            async: false,
            headers: {
              'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            },
            dataType: "json",
            success:function(response) {                  
              console.log(response);
              showEmails(p.id);  
            }               
          });

        });

        if(p.id){
          showEmails(p.id);
        }

        modal.modal({show : true});    
  });

Это код моего контроллера.

public function store(Request $request){

ProspectEmails::create(array_merge($request->all(), ['company_id' => Auth::User()->company_id], ['prospect_id'=>$request->prospect_id], ['tag'=>false]));        
return Response()->json($request);
}

Проблема в том, что, как только я впервые открываюсь и регистрируюсь, все работает нормально. Но когда я закрываю модальное и снова открываю и регистрирую, возвращается тот регистр, который я сделал 2 раза без всякого токена. Закройте модальное снова и снова откройте и зарегистрируйте, и верните этот регистр 3 раза, без токена снова. showEmails - это функция, которая показывает регистрацию в таблице в обычном режиме, а также показывает повторные значения при каждой регистрации. Даже база данных показывает повторяющиеся значения, поэтому у меня есть подтверждение, что основная ошибка либо в моем модальном, либо в запросе Ajax с методом POST. Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 16 января 2020

Вы регистрируете щелчок каждый раз, когда открываете модальное:

$('.store-email').on('click', ...

При первом открытии вы регистрируете слушателя.

Второй раз Вы открываете его, регистрируете слушателя, и теперь у вас есть 2 и т. д.

Поскольку вы не перезагружаете страницу, слушатели не go уходят. Вы должны удалить прослушиватель событий, когда модальное окно закрывается, или проверить, добавили ли вы его уже и не добавляете снова:

https://api.jquery.com/off/

Легко способ сделать это - вызвать метод off прямо перед регистрацией слушателя, гарантируя, что у вас подключен только 1 слушатель:

    let modal = $('#emailModal');
    let form = $('#emailModalProspect');

    $('#prospect_id_email').val(p.id).change();

    // ADDED LINE
    $('.store-email').off('click');
    $('.store-email').on('click', function(b){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...