1
I have 2 functions: A function 1 returns a JSON via AJAX and lists the data in an HTML table dynamically, until then everything works. The function 2 need to manipulate the same data, however, I did not want to make another AJAX request invoking the function 1 again and given that the data is already on the client side. I am currently using a global variable that stores the return of AJAX, so I use it in other functions, but I know that global variable is not a good practice. It is possible to store AJAX return data in a variable without being global and use it in other functions?
Code for function 1:
//Variavel com escopo global para guardar os dados da consulta
//Quando é feito uma requisição AJAX na função listarRegistros
dadosJson = [];
paginaAtual = 0;
//Função para listar registros de qualquer tabela via AJAX
//Passado o NOME da TABELA conforme o que está no bando de dados
function listarRegistros(tabela, form, input, pagina, nomeModal) {
var qtde = $("#cbo-qtde-registros").val();
//Abrindo reguisição AJAX e definindo parametros
$.ajax({
type: 'POST',
url: '../file/crud-cad-redes.php?op=lista-all' + '&tabela=' + tabela,
dataType: 'JSON',
success: function (dados) {
if (dados) {
//Se a consulta retornar os dados é chamado a função para montar a tabela
dadosJson = dados;//setando variavel global para armazenar os dados de retorno do AJAX
montaTabela(dados, tabela, pagina, qtde, nomeModal);
limparInputs();
} else {
alert('erro');
}
}
});
return false;
}
Code for function 2:
//Função para montar tabela com arrays JSON
function montaTabela(dados, tabela, pagina, qtde, nomeModal) {
//Limpa o body da respectiva tabela
$('#' + tabela + ' > tbody > tr').remove();
var tbody = $('#' + tabela + ' > tbody');
//Chamando a função para listar as colunas da tabela e atribuindo o retorno na variavel
var arrColunas = listaColunasTabela(tabela);
//Loop para montar as linhas com cada registro do array JSON da consulta - sistema de paginação
for (var i = pagina * qtde; i < dados.length && i < (pagina + 1) * qtde; i++) {
tbody.append(
//Em cada iteração é chamado a função para montar as colunas da linha
'<tr>' + montaColunas(dados[i], arrColunas, nomeModal) + '</tr>'
);
}
//Setando valor do input text da navegação da paginação e ajustando os botoes da paginação
$('#txt-navegacao').val(('Página ' + (pagina + 1) + ' de ' + Math.ceil(dados.length / qtde)));
ajustarBotoes(pagina, qtde, dados);
}
//Função para montar as colunas e seus atributos de cada linha da tabela
function montaColunas(dados, arrColunas, nomeModal) {
//Recuperando o primeiro elemento do array JSON para saber a
//A qtde de colunas (cabeçalho da tabela enviado pela consulta SLQ) e
//Recuperar as keys do elemento (nomes dos cabeçalhos de cada registro)
var elemento = Object.keys(dados);
var colunas = '';
//Loop para montar as colunas - Neste caso do ultimo para o primeiro registro do array JSON
for (var j = elemento.length - 1; j >= 0; j--) {
//Loop para iterar o array de colunas da tabela HTML
for (var k = 0; k < arrColunas.length; k++) {
//Verifica se nome da classe do array de colunas da tabela HTML é
//igual ao nome da key do elemento do array JSON da consulta
//Se for igual a coluna é exibida na tabela, caso contrario e desconsiderada
if (arrColunas[k] == elemento[j]) {
//Na posição 0 do loop é chamado a função para montar os dados da respectiva coluna
if (j == 0) {
colunas += montaDadosColuna(dados, elemento, nomeModal) + '</td>';
//Nas demais posições é adicionado as colunas HTML e os seus valores normalmente
} else {
colunas += '<td>' + dados[elemento[j]] + '</td>';
}
}
}
}
//Retornando o resultado para a função MontaTabela
return colunas;
}
//Função para montar a coluna com os dados para selecionar posteriormente
function montaDadosColuna(dados, elemento, nomeModal) {
var coluna = '<td';
//Loop para inserir os DATAs no respectiva TD da tabela
for (var i = elemento.length - 1; i >= 0; i--) {
//É adicionado o DATA + a key do elemento do array JSON
coluna += ' data-' + elemento[i] + '="' + dados[elemento[i]] + '"';
}
//Fechando a tag TD é adicionado um icone com a classe para selecionar o registro na tabela posteriormente
//Os DATAs são utilizado no momento do click deste icone para preencher o formulario
coluna += '><img src="../img/btn_modal_05.png" height="20px" style="cursor:pointer" class="btn-seleciona" title="Clique aqui para editar o registro" data-modal="' + nomeModal + '"' + '>';
return coluna;
}
//Função para listar e armazenar em array os nomes das classes das colunas da respectiva tabela
//A função recupera as classes que estão nas tags 'th' da respectiva tabela
function listaColunasTabela(tabela) {
var arrColunas = [];
//Iteração na tag 'th' para empilhar os nomes das classes
$('#' + tabela + ' > thead th').each(function () {
arrColunas.push($(this).attr('class'));
});
//Retornando o array com as classes das colunas
return arrColunas;
}
//Função move para ultima pagina da paginação
function moveLast(nomeModal) {
paginaAtual = Math.floor(dadosJson.length / $("#cbo-qtde-registros").val());
montaTabela(dadosJson, nomeTabela, paginaAtual, $("#cbo-qtde-registros").val(), nomeModal);
}
//Função move para próxima pagina da paginação
function moveNext(nomeModal) {
if (paginaAtual < dadosJson.length / $("#cbo-qtde-registros").val() - 1) {
paginaAtual++;
montaTabela(dadosJson, nomeTabela, paginaAtual, $("#cbo-qtde-registros").val(), nomeModal);
}
}
//Função move para pagina anterior da paginação
function movePrevious(nomeModal) {
if (paginaAtual > 0) {
paginaAtual--;
montaTabela(dadosJson, nomeTabela, paginaAtual, $("#cbo-qtde-registros").val(), nomeModal);
}
}
//Função move para primeira página da paginação
function moveFirst(nomeModal) {
paginaAtual = 0;
montaTabela(dadosJson, nomeTabela, paginaAtual, $("#cbo-qtde-registros").val(), nomeModal);
}
//Função para habilitar ou desabilitar os botoes de navegação da paginação
function ajustarBotoes(pagina, qtde, dados) {
$('#btn-next').prop('disabled', dados.length <= qtde || pagina >= dados.length / qtde - 1);
$('#btn-previous').prop('disabled', dados.length <= qtde || pagina == 0);
$('#btn-last').prop('disabled', dados.length <= qtde || pagina >= dados.length / qtde - 1);
$('#btn-first').prop('disabled', dados.length <= qtde || pagina == 0);
}
What is function 2? is
montaTabela
? where you usedadosJson
?– Sergio
Sergio. I’ve entered function 2 now. I’m using the global variable I set in the AJAX request Success, the one I’d like to delete.
– RDamazio
It’s just these two that use
dadosJson
?– Sergio
No, there are other functions that use the dataJson as well.However, if I can recover the AJAX value in this function, the others will receive the data as parameter.
– RDamazio
So you better put in the full code, so we have a better idea. They’re different files or the code is all in one file?
– Sergio
Sergio, posted all the functions. Note that there is also another paginate variable as global. This is a pagination system I created for the HTML table. My idea is to create a single manipulate functionPagination() and within it create all the pagination control, but for this I need the data of the ajax request.
– RDamazio
sessionStorage would not be a good?
– Max Rogério
@Maxrogério, Perfect your suggestion!!! I researched about sessionStorage and managed to solve my problem. Now the code has become much cleaner and no need to use global variables. Thank you very much!
– RDamazio
Oops! If you need me...
– Max Rogério
Blz... Just a question, I’m new to Stackoverflow, have to mark something as solved in the topic, post the code solved I don’t know?
– RDamazio