[RESOLVIDO]vRaptor - forEach repetindo ID

52 respostas
M

tenho uma pequena duvida, nas paginas da minha aplicação vraptor eu tenho um table que faz o seguinte.

<tbody> <c:forEach items="${produtoList}" var="produto"> <tr> <td id="pCodigo">${produto.codigo}</td> <td>${produto.nome}</td> <td>${produto.descricao}</td> <td>${produto.preco}</td> <td> <a href="<c:url value="/produto/editar/${produto.codigo}"/>"> <img alt="Editar Produto" src="<c:url value="/resources/img/icons/editar.png"/>"> </a> </td> <td> <a id="deleteRow" href="#"> <img alt="Editar Produto" src="<c:url value="/resources/img/icons/lixeira.png"/>"> </a> </td> </tr> </c:forEach> </tbody>

e tenho um script assim:

$('#deleteRow').click(function(){ var pCodigo = document.getElementById("pCodigo").innerHTML; var tr = $(this).addClass('row_selected'); oTable.fnDeleteRow(tr); $.ajax({ url:'<c:url value="/util/delete/" />'+pCodigo, success:function(data){ alert('Passou'); }, error:function(){ alert('Erro'); } }); });

só que toda vez que na pagina do vraptor mostra os icones pra clickar, só funciona para a primeira linha , ou seja se eu tentar clicar na segunda linha essa açao nao ocorre, é pq ele so permite um id na mesma pagina ou nao tem nada haver? pq estou olhando meu html pelo browser e todos tem o id deleteRow

52 Respostas

Rafael_Guerreiro

Vamos lá!

ID é um identifier, ou seja, um identificador. Para que você possa saber qual é o registro, você precisa dar um identificador UNICO.

Ou seja, vc está colocando “pCodigo” em TODAS as linhas… Isso é um erro gravíssimo.

O ID NUNCA pode repetir dentro de uma página HTML… Não importa nem se o elemento for diferente.

Por isso ele só pega o primeiro, pq ele só considera o primeiro elemento que aparece com esse ID. Para fazer o que você quer fazer, você vai precisar usar a class.

Primeiro:

Segundo:

$('#deleteRow').click(function(){ var self = $(this); var pCodigo = self.parent().siblings('.pCodigo');// Está pegando o irmão do pai do elemento clicado que tem a class pCodigo. var tr = self.addClass('row_selected'); oTable.fnDeleteRow(tr); $.ajax({ url:'&lt;c:url value="/util/delete/" /&gt;'+pCodigo, success:function(data){ alert('Passou'); }, error:function(){ alert('Erro'); } }); });

M

rafael, só que agora fiz a seguinte modificaçao.

$(document).ready(function() {
		oTable = $('#produtoList').dataTable({
			"sDom" : "<'row'<'span8'l><'span8'f>r>t<'row'<'span8'i><'span8'p>>",
			"sPaginationType": "bootstrap"
		});
		 
	});
	
	function fnClickDeleteRow() {
		var tr = $(this);
		oTable.fnDeleteRow(tr);
	}
<table id="produtoList" class="table table-bordered table-striped table-hover">
	<thead>
		<tr>
			<th>#</th>
			<th>Nome</th>
			<th>Descrição</th>
			<th>Preço</th>
			<th>Editar</th>
			<th>Excluir</th>
		</tr>
	</thead>
	<tbody>
		<c:forEach items="${produtoList}" var="produto">
			<tr>
				<td id="pCodigo">${produto.codigo}</td>
				<td>${produto.nome}</td>
				<td>${produto.descricao}</td>
				<td>${produto.preco}</td>
				<td>
					<a href="<c:url value="/produto/editar/${produto.codigo}"/>">
						<img alt="Editar Produto" src="<c:url value="/resources/img/icons/editar.png"/>">
					</a>				
				</td>
				<td>
					<a id="deleteRow" href="#" onclick="fnClickDeleteRow();">
						<img alt="Editar Produto" src="<c:url value="/resources/img/icons/lixeira.png"/>">
					</a>				
				</td>
			</tr>
		</c:forEach>
	</tbody>
</table>

tipo agora coloquei em cima de uma function, agora ele elimina a linha, porem só faz uma vez, depois que eu elimino a linha e clicar em outro, nao elimina, ou seja se tiver 5 linhas, qualquer uma das 5 linhas é eliminada, porem se eu clicar novamente em uma das 4 que ficaram, ele nao elimina.

Rafael_Guerreiro

NAO FAÇA ASSIM!!! NUNCA use eventos dentro das tags (onclick).

Do jeito que tava estava certo.

Você continua com o ID ao invés da CLASS…

M

Rafael Guerreiro:
Vamos lá!

ID é um identifier, ou seja, um identificador. Para que você possa saber qual é o registro, você precisa dar um identificador UNICO.

Ou seja, vc está colocando “pCodigo” em TODAS as linhas… Isso é um erro gravíssimo.

O ID NUNCA pode repetir dentro de uma página HTML… Não importa nem se o elemento for diferente.

Por isso ele só pega o primeiro, pq ele só considera o primeiro elemento que aparece com esse ID. Para fazer o que você quer fazer, você vai precisar usar a class.

Primeiro:

Segundo:

$('#deleteRow').click(function(){ var self = $(this); var pCodigo = self.parent().siblings('.pCodigo');// Está pegando o irmão do pai do elemento clicado que tem a class pCodigo. var tr = self.addClass('row_selected'); oTable.fnDeleteRow(tr); $.ajax({ url:'&lt;c:url value="/util/delete/" /&gt;'+pCodigo, success:function(data){ alert('Passou'); }, error:function(){ alert('Erro'); } }); });

tá rafael, mais ai esse $(’#deleteRow’) é o id de ou seja ele so está setando para a primeira linha do como modificar para que ele possa pegar de qualquer linha? e especificando somente o ultimo de excluir.

Rafael_Guerreiro

USE O CLASS!!!

M

no caso, se eu trocar por class ai em vez de fica $(’#deleteRow’) fica como? fica $(’.deleteRow’).click…

Rafael_Guerreiro

Isso. Teste!

M

testei, só que tem um problema ele só elimina a PRIMEIRA linha, mesmo se eu clicar na segunda linha, ele elimina a Primeira Linha.

Rafael_Guerreiro

Mostra o código.

M
<table id="produtoList" class="table table-bordered table-striped table-hover">
	<thead>
		<tr>
			<th>#</th>
			<th>Nome</th>
			<th>Descrição</th>
			<th>Preço</th>
			<th>Editar</th>
			<th>Excluir</th>
		</tr>
	</thead>
	<tbody>
		<c:forEach items="${produtoList}" var="produto">
			<tr>
				<td class="pCodigo">${produto.codigo}</td>
				<td>${produto.nome}</td>
				<td>${produto.descricao}</td>
				<td>${produto.preco}</td>
				<td>
					<a href="<c:url value="/produto/editar/${produto.codigo}"/>">
						<img alt="Editar Produto" src="<c:url value="/resources/img/icons/editar.png"/>">
					</a>				
				</td>
				<td>
					<a class="deleteRow" href="#">
						<img alt="Editar Produto" src="<c:url value="/resources/img/icons/lixeira.png"/>">
					</a>				
				</td>
			</tr>
		</c:forEach>
	</tbody>
</table>

<script type="text/javascript">

	/* Table initialisation */
	$(document).ready(function() {
		oTable = $('#produtoList').dataTable({
			"sDom" : "<'row'<'span8'l><'span8'f>r>t<'row'<'span8'i><'span8'p>>",
			"sPaginationType": "bootstrap"
		});
	   
	});
	
	$(document).ready(function() {
		$('.deleteRow').click(function(){
			  var self = $(this);
			  var pCodigo = self.parent().siblings('.pCodigo');
			  oTable.fnDeleteRow(self);
		      $.ajax({ 
		    	 url:'<c:url value="/produto/delete/" />'+pCodigo,
		         success:function(data){
		        	alert('Passou');
		         },  
		         error:function(){
		            alert('Erro');
		         }  
		      });  
		   });
	});
	
</script>

e outra, esse var pCodigo = self.parent().siblings('.pCodigo'); ele vai pegar o valor do id que esta no html?

Rafael_Guerreiro

Você precisa pegar o inner html desse cara
Faça assim:

M

modifiquei, mais dá uma olhada ae o outro problema, que ele só está excluindo a primeira linha e depois de excluir essa linha se eu clicar novamente ele nao exclui nada.

é como se estivese setando esses class somente para a primeira linha do meu forEach

Rafael_Guerreiro

Você está passando self para o dataTables…

Precisa passar o TR:

M

“Vou testar sua modificaçao”, atualmente está da seguinte forma.

rafael, fiz o seguinte teste, coloquei agora 3 linhas, e ele so esta excluindo sempre a primeira linha, por exemplo

1-
2-
3-

se eu clicar em excluir qualquer um desses ele exclui a 1, ai fica

2-
3-

se eu clicar em excluir em qualquer um desses, ele exclui a 2 ai fica

3-

e nao exclui a 3 pq nao tem uma linha acima.

M

rafael, implementei sua modificaçao, e está exatamente como informei na resposta acima, dá uma lida.

Rafael_Guerreiro

Tente ver os parâmetros que estão sendo enviados para o server.

Coloque alert para descobrir os valores que estão sendo passados nas configurações e veja a documentação: http://datatables.net/ref

M

fiz essa modificaçao

var self = $(this);
			  var tr = self.closest('tr');
			  var pCodigo = self.parent().siblings('.pCodigo').html;
			  oTable.fnDeleteRow(tr);

quando passo o mouse em cima do debug da variavel tr, ele me dá a linha que eu realmente quero, eu axo que possa ser que dentro do fnDeleteRow tem que passar algo a mais, vou dar uma olhada.

M

rafael. consegui, segue a modificaçao.

$('.deleteRow').click(function(){
			  var self = $(this);
			  var tr = self.closest('tr');
			  var pCodigo = self.parent().siblings('.pCodigo').html;
			  oTable.fnDeleteRow(tr[0]); //estava vendo a parte que ele insere a posiçao e testei essa inserção e está funcionando corretamente
//
M

o var pCodigo = self.parent().siblings(’.pCodigo’).html;

nao está recebendo o html do codigo nao ;/

alguem saberia como receber? estou debugando e quando chega na parte do pCodigo ele simplesmente desaparece do firebug como se o codigo nao estivesse correto.

ps: consegui, ficou da seguinte forma: var codigo = self.parents(‘td’).siblings(’.pCodigo’).html();

Rafael_Guerreiro

Vou te explicar.

Primeiro:
tr[0] deu certo por que ele retorna uma instancia do Javascript e não do jQuery. Ou seja, o método do dataTables espera uma instancia do javascript. Isso é a mesma coisa que tr.get(0)

Segundo:
.html() é um método e não um atributo.

M

ok, vou tentar modificar para deixar da maneira correta.

sem querer abusar, você ja viu alguma vez como efetuar um update de uma row, excluir ja consegui, queria saber se tem como efetuar o update, mais a api nao está me ajudando muito.

Rafael_Guerreiro

Você vai ter que fazer isso manualmente mesmo. Olhe na apostila FJ-28 o exemplo que eles dão lá. Vc vai ter que abrir um form, carregar os dados depois persistir.

M

na verdade não tem, ja terminei de ver ela, é pq estou usando o datatable do jquery e tenho um usuario que tem a opçao ativo/inativo quando clica na bolinha verde, ela fica vermelha e vice versa, só que da forma que quero fazer é somente atualizar a linha, ou seja vai enviar a requisiçao via ajax e somente vai dar um update na linha, porem da forma que é feita na fj28 ele faz um request para a mesma pagina, e isso é ruim pra mim pq se eu tiver 400 usuarios, ai eu filtro no datatable, quando ativar, ele mostra novamente a pagina com os 400 usuarios, em vez de atualizar e deixar o datatable mostrando somente a mesma linha que modifiquei.

Rafael_Guerreiro

Veja se isso responde.
http://datatables.net/ref#fnUpdate
Você precisa começar a procurar nas docs para ver se não encontra o que precisa.

M

na verdade eu até encontrei, mais o maior problema que encontrei é:

oTable.fnUpdate( ‘Example update’, 0, 0 );

‘’ esse texto é o que vai ser atualizado.
0 - esse zero do meio é a linha TR,
0 - esse ultimo zero é o td da linha,

o problema é que nao sei pegar a posiçao utilizando jquery, ou seja, teria que pegar esses numeros dinamicamente e não conheço a forma.

o segundo problema é que vou ter que trocar uma imagem e nao uma string.

e o terceiro problema é que novamente, se eu clicar uma vez, funciona, se eu clicar novamente, nao funciona.

e mesmo assim rafael, queria agradecer, você ja adiantou meus estudos e muito.

Rafael_Guerreiro

o problema é que nao sei pegar a posiçao utilizando jquery, ou seja, teria que pegar esses numeros dinamicamente e não conheço a forma.
$(‘selector’).index(); http://api.jquery.com/index/

o segundo problema é que vou ter que trocar uma imagem e nao uma string.
É o botão de verde para vermelho e vice-versa? Existe uma solução bem elegante para isso.

e o terceiro problema é que novamente, se eu clicar uma vez, funciona, se eu clicar novamente, nao funciona.
Olhe se vc não está usando e outras coisas assim…

M

bem, então vamos por partes

a linha ja estou conseguindo colocar a partir do tr[0] que fiz acima, agora vou tentar pegar o index do td respectivo.

e se der, mande o material de como mudar o verdinho pro vermelho e vice versa, na verdade estou fazendo exatamente isso, só que com os meus proprios icones.

Rafael_Guerreiro

Nesse caso eu prefiro te ensinar por aqui. Volte quando conseguir essa parte.

M

Pronto rafael, consegui.

segue o codigo completo da pagina em questão

meu table:
<table id="usuarioList" class="table table-bordered table-striped table-hover">
	<thead>
		<tr>
			<th>#</th>
			<th><fmt:message key="form.nome"/></th>
			<th><fmt:message key="form.login"/></th>
			<th><fmt:message key="form.senha"/></th>
			<th><fmt:message key="usuario.form.permissao"/></th>
			<sec:authorize ifAnyGranted="ROLE_ADMINISTRADOR">
			<th><fmt:message key="usuario.form.ativo"/></th>
			</sec:authorize>
		</tr>
	</thead>
	<tbody>
		<c:forEach items="${usuarioList}" var="usuario">
			<tr>
				<td class="pCodigo">${usuario.codigo} </td>
				<td>${usuario.nome}</td>
				<td>${usuario.login}</td>
				<td>${usuario.senha}</td>
				<td>
					<a href="#">
						<img src="<c:url value="/resources/img/icons/ROLE_ADMINISTRADOR_${usuario.permissao.contains('ROLE_ADMINISTRADOR')}.png"/>" alt="Administrador">
					</a>
					<a>
						<img src="<c:url value="/resources/img/icons/ROLE_USUARIO_VIP_${usuario.permissao.contains('ROLE_USUARIO_VIP')}.png"/>" alt="Usuario Vip">
					</a>
				</td>
				<sec:authorize ifAnyGranted="ROLE_ADMINISTRADOR">
				<td>
					<a class="updateRow" href="#">
						<img alt="Ativar" src="<c:url value="/resources/img/icons/objeto_ativo_${usuario.ativo}.png"/>">
					</a>				
				</td>
				</sec:authorize>
			</tr>
		</c:forEach>
	</tbody>
</table>

meu script

$(document).ready(function() {
		$('.updateRow').click(function(){
			  var self = $(this);
			  var td = self.closest('td').index();
			  var tr = self.parents('tr');
			  var codigo = self.parents('td').siblings('.pCodigo').html();
		      $.ajax({ 
		    	 url:'<c:url value="/usuario/ativar/" />'+codigo,
		    	 type: 'POST',
		         success:function(){
		        	 oTable.fnUpdate( 'Example update', tr.get(0), td);
		         },  
		         error:function(){
		            alert('Erro');
		         }  
		      });  
		   });

o script está modificando exatamente no local do

<td>  
                    <a class="updateRow" href="#">  
                        <img alt="Ativar" src="<c:url value="/resources/img/icons/objeto_ativo_${usuario.ativo}.png"/>">  
                    </a>                
                </td>
que é onde eu quero mudar.
Rafael_Guerreiro

Para alternar entre imagens de forma elegante.

Primeiro passo:
Abra um editor de imagens e coloque as duas imagens lá, uma ao lado da outra. Salve como icon_full…

Segundo passo:
Pegue o tamanho de cada imagem.

Terceiro passo:
remova a tag img da tag “a”…

Quarto passo:
Você vai precisar pensar em 2 nomes de classes CSS para quando vc chamar uma, ele coloca uma imagem, quando vc chamar a outra, ele coloca outra imagem.

Por enquanto vamos até aqui. Mas tem mais passos ainda.

M

Rafael Guerreiro:
Para alternar entre imagens de forma elegante.

Primeiro passo:
Abra um editor de imagens e coloque as duas imagens lá, uma ao lado da outra. Salve como icon_full…

Segundo passo:
Pegue o tamanho de cada imagem.

Terceiro passo:
remova a tag img da tag “a”…

Quarto passo:
Você vai precisar pensar em 2 nomes de classes CSS para quando vc chamar uma, ele coloca uma imagem, quando vc chamar a outra, ele coloca outra imagem.

Por enquanto vamos até aqui. Mas tem mais passos ainda.

cada imagem tem 16x16 e 16x16 cada, então eu fiz uma imagem 32x16 e coloquei uma ao lado da outra.

Rafael_Guerreiro

Perfeito!

Vai funcionar assim: vamos ter uma classe css chamada icon-editable.

A ideia é a seguinte, quando trocarmos a classe da tag a, o browser vai mover essa imagem para o lado e vai mostrar só o que tiver dentro da tag a… Ou seja, ele “troca” de imagem.

A vantagem dessa abordagem é que como usamos apenas 1 imagem para fazer esse efeito, tudo já vem carregado, além de minimizarmos a quantidade de requisições.

Então precisamos criar essa classe icon-editable que vai preparar a tag a para fazer esse efeito e depois teremos mais 1 classe que vai mudar o ícone que está sendo mostrado.

a.icon-editable {
   overflow: hidden; /*Não mostra o que estiver fora da tag.*/
   text-indent: 100%; /*Identa o texto que estiver dentro para fora da tag, a fim de ser escondido.*/
   display: inline-block; /*Para conseguirmos definir uma altura e largura, o elemento não pode ser inline.*/

   /*O mesmo tamanho de 1 ícone.*/
   width: 16px;
   height: 16px;

   /*Muda o box-sizing para empurrarmos o conteúdo para fora da tag.*/
   -ms-box-sizing: border-box;
   -moz-box-sizing: border-box;
   -webkit-box-sizing: border-box;
   box-sizing: border-box;
   padding-top: 16px; /*É o mesmo valor da altura*/

   background-image: url(img/icon_full.png); /*Aqui entra a imagem com os dois ícones.*/
   background-repeat: no-repeat; /*Não queremos que o background repita.*/
   background-position: 0 0; /*Por default,  mostra a primeira imagem.*/
}

a.icon-editable.inativo {
   background-position: -16px 0; /*Se ele tiver essa classe inativo (mude o nome), ele leva a imagem do background 16 pixels para a esquerda.*/
   /*Nesse caso é -16 por queremos levar a imagem para a esquerda e não o elemento para a direita...*/
}

E ai, você precisa adicionar a classe .icon-editable na tag a e, quando for inativo, adiciona a class .inativo que ele vai mudar a imagem de lugar.

Assim dá a impressão de que ela está sendo trocada na hora, ela não vai precisar ser carregada depois.

M

mais ai vejo um probleminha:

background-position: 0 0; /Por default, já mostra a primeira imagem./

se por acaso a primeira imagem for o verde, ai eu vou, clico e mudo para vermelho(inativo), se eu atualizar a pagina ele me retorna verde novamente não? sendo que era pra estar vermelho.

Rafael_Guerreiro

Por esse motivo mesmo eu disse isso:

M

então, rafael, antes de implementar esse teu, eu tava matutando ake e tava fazendo da seguinte forma:

$(document).ready(function() { $('.updateRow').click(function(){ var self = $(this); var url = self.children().attr("src"); var td = self.closest('td').index(); var tr = self.parents('tr'); var codigo = self.parents('td').siblings('.pCodigo').html(); $.ajax({ url:'<c:url value="/usuario/ativar/" />'+codigo, type: 'POST', success:function(){ if(url.indexOf("true") >= 0 ) { oTable.fnUpdate( '<a class="updateRow" href="#">'+ '<img alt="Ativar" src="<c:url value="/resources/img/icons/objeto_ativo_false.png"/>">'+ '</a>', tr.get(0), td); } if(url.indexOf("false") >= 0 ) { oTable.fnUpdate( '<a class="updateRow" href="#">'+ '<img alt="Ativar" src="<c:url value="/resources/img/icons/objeto_ativo_true.png"/>">'+ '</a>', tr.get(0), td); } },

é errado?

pq vou comentar aqui essa parte e implementar a forma que vc está falando.

Rafael_Guerreiro

Isso aqui vai simplificar:

if(url.indexOf(&quot;true&quot;) &gt;= 0 ) { self.addClass('inativo'); // oTable.fnUpdate( // '<a >'+ // '<img /resources/img/icons/objeto_ativo_false.png"/>&quot;&gt;'+ // '</a>', tr.get(0), td); } if(url.indexOf(&quot;false&quot;) &gt;= 0 ) { self.removeClass('inativo'); // oTable.fnUpdate( // '<a >'+ // '<img /resources/img/icons/objeto_ativo_true.png"/>&quot;&gt;'+ // '</a>', tr.get(0), td); }

M

utilizando essa estrutura que você me falou do editable neh?

Rafael_Guerreiro

Sim. Eu atualizei a minha resposta, agora está certo…

M

mais vou ter que editar aqui pq essa url está pegando o src de IMG então vou ter que adaptar para esses class que vc informou. Porque nesse seu exemplo não tem img.

Rafael_Guerreiro

Isso mesmo. Pode usar o hasClass do jQuery:

http://api.jquery.com/hasClass/

M

ah, verdade, deixa eu implementar aqui e efetuar testes, qualquer coisa quando empacar aqui volto.

M

mais ai vai ter um probleminha.

atualmente eu faço o seguinte:

ou seja, ele ja vai setar a imagem inicial se for true ou não.

da forma que estamos fazendo, não tem uma “logica” para setar, de forma que TODOS vão começar com a primeira imagem que no caso é botao vermelho.

há ideia é que começasse com o img setando essa parte: /objeto_ativo_${usuario.ativo}.png

e depois fizesse esse jogo de moficiaçoes, pq caso contrario se deixar da seguinte maneira:

<td class="activeDesactive">
					<a class="updateRow icon-editable" href="#">
						
					</a>				
				</td>

quando inicialmente ele for fazer o ForEach, como vai setar inicialmente a imagem se ele em momento algum sabe se é true ou false para setar o inativo ou nao. a unica maneira que pensei aqui agora é fazer o seguinte:

<c:if test="{usuario.ativo}"> //true 
<td class="activeDesactive">
					<a class="updateRow icon-editable active" href="#">

					</a>				
</td>

</c:if>

<c:if test="{usuario.ativo}"> //false 
<td class="activeDesactive">
					<a class="updateRow icon-editable inactive" href="#">

					</a>				
</td>

</c:if>

obs estou usando active e inactive no class somente para ilustrar a situação, no caso é só a inserção do inativo ou remoçao da mesma class.

e depois que está setado e a modificaçao é visual, ai entraria o script, alguma ideia?

Rafael_Guerreiro

Que tal o operador ternário??

&lt;c:if test="{usuario.ativo}"&gt; //true   
&lt;td class="activeDesactive"&gt;  
                    &lt;a class="updateRow icon-editable active" href="#"&gt;  
  
                    &lt;/a&gt;                
&lt;/td&gt;  
  
&lt;/c:if&gt;  
  
&lt;c:if test="{usuario.ativo}"&gt; //false   
&lt;td class="activeDesactive"&gt;  
                    &lt;a class="updateRow icon-editable inactive" href="#"&gt;  
  
                    &lt;/a&gt;                
&lt;/td&gt;  
  
&lt;/c:if&gt;
Fica assim:
&lt;td class="activeDesactive"&gt;  
                    &lt;a class="updateRow icon-editable ${usuario.ativo ? 'active' : 'inactive'}" href="#"&gt;  
  
                    &lt;/a&gt;                
&lt;/td&gt;
M

show de bola cara, não sabia que podia fazer isso. UAHSUAHs, vivendo e aprendendo.

seguinte, a parte lógica inicial para mostrar as imagens já está funcionando.

vou partir agora para corrigir o javascript e ver se está funcionando corretamente.


edit:

então rafael, meu codigo ficou da seguinte maneira:

$(document).ready(function() {
		$('.updateRow').click(function(){
			  var self = $(this);
			  var td = self.closest('td').index(); //provavelmente nao será mais usado.
			  var tr = self.parents('tr'); //provavelmente tbm nao será mais usado
			  var codigo = self.parents('td').siblings('.pCodigo').html();
		      $.ajax({ 
		    	 url:'<c:url value="/usuario/ativar/" />'+codigo,
		    	 type: 'POST',
		         success:function(){	        		 
		        	 if(self.hasClass('ativo')) {
		        		 //preciso primeiro remover ativo para adcionar o inativo?
		        		 self.addClass('inativo');
                     } 
		        	 if(self.hasClass('inativo')) {
		        		 //preciso primeiro remover inativo para adicionar ativo?
                    	 self.addClass('ativo');
                     }        
		         },  
		         error:function(){
		            alert('Erro');
		         }  
		      });  
		   });
	});
M

seguinte rafael, está funcionando sim, porem só o primeiro click, no segundo ele ja nao muda o icone.

$(document).ready(function() {
		$('.updateRow').click(function(){
			  var self = $(this);
			  var td = self.closest('td').index(); //provavelmente nao será mais usado.
			  var tr = self.parents('tr'); //provavelmente tbm nao será mais usado
			  var codigo = self.parents('td').siblings('.pCodigo').html();
		      $.ajax({ 
		    	 url:'<c:url value="/usuario/ativar/" />'+codigo,
		    	 type: 'POST',
		         success:function(){	        		 
		        	 if(self.hasClass('ativo')) {
		        		 self.removeClass('ativo');
		        		 self.addClass('inativo');
                     } 
		        	 if(self.hasClass('inativo')) {
		        		 self.removeClass('inativo');
                    	 self.addClass('ativo');
                     }        
		         },  
		         error:function(){
		            alert('Erro');
		         }  
		      });  
		   });
	});
Rafael_Guerreiro

Vamos lá…

Use somente uma classe e coloque uma no default… e ai você usa o toggle do jquery, ele vai trocar para você.

Sugiro você trocar a imagem antes de acionar o ajax. Assim o user tem a sensação de velocidade…

Tente descobrir o porque só estar funcionando no primeiro click… Ele está indo para o server? Está inativando/ativando o registro?

M

fiz a seguinte modificação e está funcionando corretamente com 1 ou N clicks. xD

$(document).ready(function() {
		$('.updateRow').click(function(){
			  var self = $(this);
			  var codigo = self.parents('td').siblings('.pCodigo').html();
		      $.ajax({ 
		    	 url:'<c:url value="/usuario/ativar/" />'+codigo,
		    	 type: 'POST',
		         success:function(){	        		 
		        	 if(self.hasClass('inativo')) {
		        		 self.removeClass('inativo');
                     } else {
                    	 self.addClass('inativo');
                     }       
		         },  
		         error:function(){
		            alert('Erro');
		         }  
		      });  
		   });
	});
<td class="activeDesactive">
	<a class="updateRow icon-editable ${usuario.ativo ? '' : 'inativo'}" href="#"></a>				
</td>

quanto a trocar a imagem antes do ajax, como ficaria? no caso dentro de success não teria nenhuma informação?

Rafael_Guerreiro

Isso mesmo, dentro do success não teria nada. USE O TOGGLECLASS que eu mostrei em cima…

Sugiro vc colocar o toggleclass no error também, assim, quando der erro, vc volta para o que estava.

M

no caso toggleClass no lugar do remove class e add CLass? mais tipo, so preciso colocar toggleClass no error, se a mudança estiver fora do sucess correto?

Rafael_Guerreiro

Sim.

Sim.

M

eu acho melhor deixar no success mesmo, pq garante que a informação foi realmente modificada, e a diferença não é tão bruta assim.

vou partir para o editar usuário, vai ser uma nova aventura kkAUSHAUsh

obrigado pela ENORME ajuda.

M

um ultimo probleminha:

possuo o seguinte javascript:

$(document).ready(function(){ $('#addEmpresa').on('click', function(){ var self = $('#codigoDaEmpresa'); var selecionado = self.val(); // pega o codigo digitado no input $.ajax({ url:'<c:url value="/usuario/addEmpresaTemp/" />'+selecionado, type: 'POST', dataType:'json', success:function(data){ var options = []; for (var i = 0; i < data.length; i++) { options.push('<tr>'); options.push('<td class="pCodigo">'+data[i].codigo+'</td>'); options.push('<td>'+data[i].descricao+'</td>'); options.push('<td>'+data[i].cnpj+'</td>'); options.push('<td style="text-align:center;">'+ '<a style="text-align:center;" class="deleteRow" href="#">'+ '<img alt="Excluir Empresa" src="<c:url value="/resources/img/icons/lixeira.png"/>">'+ '</a>'+ '</td>'); options.push('</tr>'); } $('#povoarEmpresa').html(options.join('')); }, error:function(){ alert('Erro'); } }); }); });

se vc prestar atenção estou montando nessa pagina esse td

options.push('<td style="text-align:center;">'+ '<a style="text-align:center;" class="deleteRow" href="#">'+ '<img alt="Excluir Produto" src="<c:url value="/resources/img/icons/lixeira.png"/>">'+ '</a>'+ '</td>');
que será um icone para excluir a linha dessa tabela.

podem quando monta, ele fica tudo direitim como tem que ficar, porem quando eu clico nessa imagem era pra acionar o seguinte javascript:

// remover empresa da tabela e da lista $(document).ready(function() { $('.deleteRow').click(function(){ var self = $(this); var tr = self.closest('tr'); var codigo = self.parents('td').siblings('.pCodigo').html(); $.ajax({ url:'<c:url value="/usuario/delEmpresaTemp/" />'+codigo, type: 'POST', success:function(){ alert('chegou'); tr.remove(); }, error:function(){ alert('Erro'); } }); });

coloquei pra debugar e ele nao está acionando esse javascript

Criado 22 de maio de 2013
Ultima resposta 23 de mai. de 2013
Respostas 52
Participantes 2