Pergunta

eu tenho lista de linhas que o usuário selecionar e eu quero excluí-los, um por um e mostrar o resultado no final.

Obviamente, se eu apenas fazer loop simples e chamar cada função ajax tempo, mas como eu posso loop e verificar qual successed e qual falhou e quando eles são tudo feito?

Como você faria isso? o que é a maneira correta de fazer a edição em massa / apagar?

Foi útil?

Solução

Cada solicitação ajax vai ter sobrecarga associada a ele. Seria uma má idéia para fazer uma chamada para cada linha, pois poderia sobrecarregar o servidor com pedidos e você poderia DoS-se se sua receber tráfego suficiente. Além disso, todos os navegadores têm um limite de quantas solicitações HTTP pode ser feita de uma só vez, por isso (dependendo do browser), as exclusões vai acontecer em rajadas, não todos de uma vez, mesmo se você dizer-lhes para executar um após o outro.

Sua melhor opção seria a de agrupar as linhas para editar / apagar em uma matriz JSON e enviá-los para o servidor em uma única solicitação. No servidor, você pode, então, analisar o JSON e excluir os itens em conformidade. Quando estiver terminado, retornar uma matriz JSON que contém os resultados.

Este código pseudo-código jQuery assume que você está tanto a segmentação de navegadores com um JSON objeto , ou você está usando json2.js . Basicamente, este código só olha para o campo "o ID escondido" em cada linha da tabela que você exibir para o usuário e adiciona-lo para uma matriz. Você pode ajustar isso como você sente que é necessário.

var recordsToDelete = [];
$("tr.myRow").each(function() {
    var id = $(this).find("input:hidden").val();
    recordsToDelete.push(id);
});
var json = JSON.stringify(recordsToDelete);

Lidar com resultados podem ser mais difícil. Você deve projetar seu sistema para que (se bem sucedida), cada linha é excluída. A menos que você está lidando com um sistema muito complexo, você nunca deve ter uma situação em algumas linhas passam e algumas linhas falhar. Se isso acontece, você precisa re-considerar o seu arquitetura do sistema. jQuery tem eventos para success e failure que você pode usar para lidar com o sucesso geral ou falha do pedido, o que eu recomendo que você usar.

Continuando a partir do código acima, esta é uma maneira de lidar com exclusão de registros. Eu uso o evento complete aqui para simplificar, mas você deve usar os eventos success e failure se possível. O evento complete sempre acontece, se um pedido bem sucedida ou não.

$.ajax({
    url: "http://stackoverflow.com/questions/1653127",        
    type: "POST", // Always use POST when deleting data
    data: { ids: json },
    complete: function(xhr, status) {
        var response = JSON.parse(xhr.responseXML);
        // Response will be an array of key/value
        // pairs indicating which rows succeeded or failed
        for (var i = 0; i < response.length; i++) {
            var recordID = response[i].recordID;
            var status = response[i].status;
            // Do stuff with the status codes here
        }
    }
});

em resposta aos comentários:

  • Para aplicativos como o Gmail, o funcionamento é tão maciçamente complicado que dizer "eu vou fazer isso dessa maneira porque o Google faz isso dessa maneira", não é uma boa idéia. Nem tudo o que trabalha para o Google irá trabalhar para cada empresa ou site. Empresas como a Google tem problemas para lidar com isso quase nenhum outras necessidades do Web site que se preocupar. No entanto, para responder à sua pergunta
    • Eu apenas verificado isso para ter certeza: GMail utiliza um pedido de AJAX com um conjunto de IDs. Não há códigos de status individuais são enviados de volta. Parece que (e eu estou especulando aqui) Gmail retorna um "ID ação" para a ação que você acabou de realizar, para que possa desfazer essa ação clicando em um link de undo que aparece brevemente após a exclusão de um e-mail.
    • Ao trabalhar em um aplicativo, você geralmente deseja torná-lo o suficiente confiável que as operações não falham. Você deve estar executando QA rigoroso para se certificar disso. Basicamente, uma operação de exclusão deve passar ou falhar como um todo. Um cenário onde isso poderia acontecer é se o usuário clicar em excluir como o servidor vai para baixo. Para o usuário, o site ainda está acima porque você não está recarregar a página, mas o pedido AJAX falhará porque ele não tem para onde ir. Você vai querer lidar com coisas como esta.
    • É realmente depende das regras de negócio do seu aplicativo. Se seu aplicativo está sendo usado em uma situação onde várias pessoas podem alterar os registros ao mesmo tempo (apenas um exemplo), algo que tenta um usuário para excluir poderia ter sido eliminada por outra pessoa pouco antes de clicar nesse botão "delete". Na maioria dos casos, eu não posso ver as pessoas se importar com quem apagou o primeiro registro, pois se ela é excluída, éSuprimida, não importa quem realmente fez isso. No entanto, uma regra de negócio pode ditar (tão ridículo como pode ser) que você precisa para relatar essas informações para o usuário. Neste caso, você teria que voltar a matriz de status para cada exclusão.
  • Para prevenir os hackers de exclusão de registros de outras pessoas, há algumas coisas a fazer:
    • Trate seus manipuladores AJAX de forma diferente do que o resto do site. Eles devem ficar sem privilégios especiais. Um pedido para um manipulador de AJAX deve se autenticado tal como tudo o resto.
    • solicitações Use Post (como eu mencionei no meu exemplo) para operações destrutivas, ou para operações que dados de alteração. Isto irá tornar mais difícil para hackers para executar Cross-Site Request Forgeries (CSRF) . Obviamente, isso não é uma coisa infalível para fazer, mas ele pára as façanhas fáceis.
    • Obviamente, não assuma o usuário tem o direito de excluir um registro só porque o usuário enviou a solicitação de exclusão. Certifique-se de verificar se o usuário que executa a eliminação tem o direito de remover cada registro. Como você fizer isso vai depender do seu aplicativo do lado do servidor.
    • Certifique-se de codificar todos os seus valores enviados o cliente para o servidor . Isso vai evitar injeções SQL.
    • Certifique-se de que você está familiarizado com a OWASP Top Ten lista . Abrange as mais comuns (mas não todas ) grandes façanhas em sites da web e explica como evitar se tornar uma vítima deles.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top