Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida em relação à diretiva "meuBotaoPerigo"

Flávio/Prezados,

Bom dia! Meu post na verdade é mais uma dúvida do que um erro (fiz os exercícios e todos funcionaram OK!). Minha dúvida é em relação a diretiva "meuBotaoPerigo".

Fiz a criação da diretiva no arquivo "minhas-diretivas.js" conforme abaixo:

    .directive('meuBotaoPerigo', function() {

        var ddo = {};

        ddo.restrict = "E";

        ddo.scope = {
            nome: '@',
            acao: '&'
        };

        ddo.template = '<button class="btn btn-danger btn-block" ng-click="acao(foto)">{{nome}}</button>'

        return ddo;
    });

E depois substitui o botão, na página "principal.html", pela diretiva criada acima:

<!--<button class="btn btn-danger btn-block" ng-click="remover(foto)">Remover</button>-->
<meu-botao-perigo nome="Remover" acao="remover(foto)"></meu-botao-perigo>

Meu ponto é o seguinte:

Quando referenciamos "incluímos" o "" na "principal.html", duas informações são passadas/alimentadas: 1) nome="Remover" (onde é passada a string "Remover") 2) acao="remover(foto)" (onde é passada a função "remover", contida no controller, juntamente com o objeto da foto (foto que quero remover)).

No meu ddo.template, estou referenciando o seguinte no atributo ng-click: "acao(foto)" (ou seja, estou passando o objeto foto aqui dentro "também"):

ddo.template = '<button class="btn btn-danger btn-block" ng-click="acao(foto)">{{nome}}</button>'

No caso, o objeto "foto" deve ser passado tanto na declaração do "meu-botao-perigo", na página html quanto no template da diretiva, correto? Meu ponto é que, diante dos pontos acima (e se eu não estiver enganado ou falando alguma besteira!) o "reaproveitamento" da diretiva, neste caso, fica restrita apenas a ações de remoção que envolvam o objeto foto? Outro ponto, se tivéssemos uma outra função que tivesse que receber dois objetos, não poderíamos reaproveitar o botão, correto?

Não sei se fui claro mas, em resumo, minha questão é em relação à dependência (explicita) do objeto foto, tanto no html (quando utilizamos a diretiva) quanto no código da diretiva.

Obrigado pela ajuda!

6 respostas
solução!

Oi Danilo, beleza? Bem, em nenhum momento eu faço isso no treinamento:

ddo.template = '<button class="btn btn-danger btn-block" ng-click="acao(foto)">{{nome}}</button>'

Eu faço é isso aqui:

ddo.template = '<button class="btn btn-danger btn-block" ng-click="acao()">{{nome}}</button>'

Como você pode ver, no template da diretiva, o ng-click recebe acao(), não há passagem de parâmetros! O que o angular faz é executar a expressão passada para acao da diretiva. Se ela recebe ou não parâmetro, quem decide isso é quem passou a expressão como no exemplo abaixo:

<meu-botao-perigo nome="Remover" acao="remover(foto)"></meu-botao-perigo>

Veja que acao recebeu remover(foto). Esse é o valor da expressão. Quando lá em nossa diretiva fazemos acao() estamos indicando para o angular que ele deve avaliar a expressão remove(foto).

Veja que isso é perfeitamente genérico e nossa diretiva pode ser reutilizada em qualquer lugar.

Ficou mais claro agora? Talvez o fato de você ter criado a diretiva diferente da maneira que criei tenha gerado essa dúvida.

Aliás, sua preocupação com reutilização de código é nota 10! Não faria sentido nenhum termos um botão que não pudesse ser reutilizado em nossa aplicação, sendo assim, nem faria sentido criarmos uma diretiva.

Oi Danilo, vi que marcou como solução, mas ficou claro a explicação? Qualquer coisa grita aqui :)

Flavio,

Obrigado pelo rápido retorno e pelos comentários! Realmente revisei a explicação e é utilizado o "acao()". Falha minha na hora de revisar o código / executar os exercícios :)

Obrigado!

Não se preocupe. Mesmo que você tenha cometido um pequeno deslize, a discussão sobre reutilização de código foi mais importante.

Sucesso e bom estudo!

Sei que a discussão já foi encerrada e resolvida, mas no vídeo realmente está sendo utilizado como "acao(foto)" dentro da diretiva, talvez por isso a confusão.