Fala ai pessoal, estou apanhando mais que o José Aldo com o Angular tentando fazer uma diretiva simples.
Meu objetivo é ter uma lista animada, quando o usuário clicar em um item, ele abrir e mostrar um conteúdo.
Eu poderia colocar essa div de conteúdo com ng-hide=true, mas estaria duplicando uma grande quantidade de código, visto que apenas um item da lista pode ter seu conteúdo aberto por vez. Ou seja, cliquei em outro item da lista, o item anterior deve ser fechado(removido do dom). No meu código estou incluindo a div no dom dinamicamente.
Vamos lá.
O código abaixo funciona, consigo incluir e remover a div que peguei no templateRequest. O problema é que o ng-show só funciona na primeira execução, ou seja, quando clico pela primeira vez. Nas outras vezes que eu clico, posso alterar a variável "mostrar" que ele não reflete no template.
Espero que entendam.
JS
.directive('minhaDiretiva', function($templateRequest, $compile) {
var ddo = {};
ddo.restrict = "A";
var itemListaPedido;
$templateRequest("js/directives/minha-diretiva.html").then(function(html){
itemListaPedido = angular.element(html);
});
var elementoAnterior;
ddo.link = function(scope, elem, attrs){
console.log(elem);
elem.bind('click', function() {
if(elementoAnterior){
if (elementoAnterior === elem) {
// Quando o usuário clica novamente na LI ele entra aqui, porém o template não liga para a variável mostrar, coloco para true e ele continua a mostrar a div.
scope.mostrar = false;
elem.next().remove();
elementoAnterior = undefined;
}else{
elementoAnterior.next().remove();
elementoAnterior = elem;
elem.after(itemListaPedido);
$compile(itemListaPedido)(scope);
}
}else{
// Essa primeira execução funciona!!!
elementoAnterior = elem;
scope.mostrar = true;
elem.after(itemListaPedido);
$compile(itemListaPedido)(scope);
}
});
}
return ddo;
});
Template utilizado na diretiva
<div ng-show="mostrar">
Alguma coisa interessante aqui
</div>
Lista que usa a diretiva
<ul>
<li>
<div excluir-pedido>
Meu conteúdo a ser clicado.
</div>
<li>
<li>
<div excluir-pedido>
Meu conteúdo a ser clicado.
</div>
<li>
<li>
<div excluir-pedido>
Meu conteúdo a ser clicado.
</div>
<li>
</ul>