Ajax не работает, если вызывается внутри загруженного шаблона ajax?

#javascript #jquery #ajax

#javascript #jquery #ajax

Вопрос:

Я использую ajax для изменения значения объекта (status), при вызове ajax объект изменяется, но страница перезагружается. вот мой шаблон:

     <table id="datatable" class="tabela">
        <thead>
            <tr>
                <th>RA</th>                   
                <th>Ações</th>                 
            </tr>
        </thead>
        <tbody>
            <g:each var="aluno" in="${listaAluno}">
                <tr>
                    <td>${aluno.ra}</td>
                    <td>
                        <g:link action="editar" controller="aluno" params="[id:aluno.id]"> <i class="fa fa-pencil button edit"></i></g:link>amp;nbspamp;nbspamp;nbsp                        
                        <g:link onClick="inativar('/aluno/inativar/${aluno.id}', 'divForm', '${aluno.nome}')"> <i class="fa fa-trash button delete"></i></g:link>
                    </td>
                </tr>
            </g:each>
        </tbody>
    </table>
    <script type="text/javascript">
        $(document).ready(function () {
        $('#datatable').dataTable({colReorder: true});
        });
    </script>
  

ajax:

 function inativar(metodo, div, objeto) {
    var confirmar = confirm("Realmente deseja remover "   objeto   " ?");    
    if (confirmar) {            
        $.ajax({
            url: metodo,
            type: "GET",            
            dataType: 'text',
            success: function (data) {
                $("#"   div).html(data);
            }
        });
    }
}
  

и метод:

 def inativar(){ 
        Aluno aluno = Aluno.get(params.id)
        aluno.status = false
        aluno.save(flush: true)
        def listaAluno = Aluno.findAllByStatus(true)        
        render(template:"list", model:[listaAluno:listaAluno])
    }
  

чего я не понимаю?

Ответ №1:

Попробуйте приведенный ниже код вместо <g:link onClick="inativar('/aluno/inativar/${aluno.id}', 'divForm', '${aluno.nome}')"> <i class="fa fa-trash button delete"></i></g:link> вызова встроенной функции onClick JS, поскольку встроенный вызов onClick отображает определение функции в глобальной области видимости.

 <g:link class="inativar"><i class="fa fa-trash button delete"></i></g:link>
  

JS-код:

 <script type="text/javascript">
        var alunoId='${aluno.id}';
        var metodo='/aluno/inativar/' alunoId;
        var divId='divForm';
        var alunoNome='${aluno.nome}';

        $(document).ready(function () {
            $('#datatable').dataTable({colReorder: true});
            //Call inativar on click
            $('.inativar').click(function(){
               inativar(metodo,divId,alunoNome);

            });
        });

        function inativar(metodo, div, objeto) {
            var confirmar = confirm("Realmente deseja remover "   objeto   " ?");    
            if (confirmar) {            
            $.ajax({
              url: metodo,
              type: "GET",            
              dataType: 'text',
              success: function (data) {
              $("#"   div).html(data);
            }
        });
    }
}
</script>
  

Комментарии:

1. попробовал, получил эту ошибку: Ошибка вычисления выражения [aluno.id ] в строке [30]: не удается получить свойство ‘id’ для нулевого объекта. И это не очень хороший вариант, потому что я собираюсь использовать этот ajax на множестве страниц

2. Если aluno.id равно null, тогда это не ошибка JS. Сначала установите этот идентификатор в object перед отображением страницы. Также jquery $ (document). готово(функция (){}); загружается при загрузке страницы.

3. Как уже говорилось, метод работает должным образом, объект изменен, проблема в том, что страница перезагружается после него.

4. Также файл create javascript содержит эту общую функцию инициализации ajax. И соответствующая страница просто загружает событие click в dom при загрузке страницы, как событие click.

5. Поскольку это ajax-запрос, страница не будет перезагружена. Убедитесь, что вы не отправляете страницу при вызове ajax.