Перезагрузки после обновления


Я делаю изменение состояния в моей базе данных, используя $.getJSON, дает право, но на возврат необходимо обновлять div, где находятся данные, и я не в состоянии выполнить эту задачу, посмотрите на код ниже:

<script>
$(function(){       
    $("[name='btncapa']").on('click',function(e){

        var IdProduto   = $(this).attr('IdProduto');
        var IdProdutoFoto = $(this).attr('IdProdutoFoto');
        var $el = $(this);

        bootbox.dialog({
            message: "Confirma a marcação de capa?",
            title: "Capa",
            buttons: {
                success: {
                    label: "Sim",
                    className: "btn-success",
                    callback: function() {
                        $.getJSON('MarcaItemFoto.php', {IdProduto: IdProduto, IdProdutoFoto: IdProdutoFoto},  function(resposta){
                            $("#diverro").html("<div class='alert alert-error'><button type='button' class='close' data-dismiss='alert'>&times;</button><strong>ERRO!</strong> " + resposta.erro + "</div>");
                        });
                        $el.parents('li').load();
                    }
                },
                danger: {
                    label: "Não",
                    className: "btn-danger",
                    callback: function() {
                    }
                }
            }
        });
        e.preventDefault();
    });
});
</script>
Author: Maniero, 2014-02-03

3 answers

Есть две потенциальные проблемы с вашим кодом:

  1. Вы, кажется, только общаемся условия ошибке в callback (анонимная функция, которую вы передаете в качестве параметра pro getJSON), но не условия успеха. Кроме того, как уже упоминалось @marcusagm, эта функция будет только вызов реквизиции удастся, хотя логику вашей программы не имеет. Если есть проблема с заявка на себя (ex.: timeout, 404 не найдена, 500-ошибка внутреннего сервера, etc) никакой код не будет вызван.

    Чтобы исправить это, я предлагаю провести также callback, ошибок. Если вы используете последнюю версию jQuery, было бы идеально:

    $.getJSON(url, parametros)
        .done(function(resposta) { /* sucesso */ })
        .fail(function() { /* erro */ });
    

    , Если хотите, даже в одной роли, чтоб обработать ошибки или успеха, вы можете использовать then:

    $.getJSON(url, parametros).then(function(resposta) { 
        /* sucesso ou erro */ 
    });
    
  2. Ajax запросов, как говорит само название, являются асинхронных. Вызов getJSON возвращает до даже ее были проведены (и дополнена). Поэтому любой код, который вы поместите после него будет работать до Ajax быть сделано, не после.

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

    $.getJSON(url, parametros).done(function(resposta) { 
        $el.parents('li').load();
    });
    

    (я Не знаю, если это была ваша цель в этой строке кода, но я подозреваю, что есть: перезагрузка только после того, как Ajax уголок готова)

P. S. На вопрос, также вы говорите, что вы делаете "изменение состояния", не так ли? В этом случае, лучшей практикой было бы не использовать HTTP GET, но это, скорее POST. Пример:

$.post(url, parametros, "json").done(function(resposta) { 
    $el.parents('li').load();
});
 4
Author: mgibsonbr, 2014-02-03 18:34:06

Вы делаете запрос и в случае успеха относился только к ошибке.

$.getJSON('MarcaItemFoto.php', {IdProduto: IdProduto, IdProdutoFoto: IdProdutoFoto},  function(resposta){
  // Aqui você deve tratar se realmente ocorreu um erro ou não.
  // Esta funcão é utilizada caso a requisição retorne um status de sucesso.
  // Aqui você tambem deve tratar os casos de sucesso, como atualizar a lista de que precisa.
});

Load делает еще один запрос Ajax см параметры в документации

$el.parents('li').load('caminho/para/retornar/o/html/atualizado');

Рекомендую относиться также, когда запрос возвращает код ошибки не ожидается, используя функцию fail() jquery. Будет выглядеть так:

$.getJSON('MarcaItemFoto.php', {IdProduto: IdProduto, IdProdutoFoto: IdProdutoFoto},  function(resposta){
   // Ação após obter resultado com código de sucesso
}).fail(
  function () {
    // Ação após obter resultado com código de erro
  }
);
 2
Author: marcusagm, 2014-02-03 18:59:43

Решение моей проблемы, было так:

$.post(url, parametros, "json").done(function(resposta) { 
    $el.parents('li').load();
});

Совет дается mgibsonbr. Обязанный.

 -1
Author: adventistapr, 2014-02-13 12:38:23