3
respostas

Até onde podemos usar one-way-data-binding em uma diretiva

Bom dia! Estou tentando criar uma diretiva que facilite a exibição de um erro quando o formulário não é submetido de forma correta. Pelos testes que fiz, parece que o meu template não funciona da seguinte forma:

<span ng-show="{{formulario}}.$submitted && {{formulario}}.{{campo}}.$error.required" class="alert alert-info form-control">
    {{mensagem}}
</span>

Minha diretiva esta assim:

    .directive('campoObrigatorio', function() {
        var ddo = {};

        ddo.restrict = 'E';

        ddo.scope = { mensagem: "@",  formulario: "@",  campo: "@"};

        ddo.templateUrl = 'js/directives/campo-obrigatorio.html'

        return ddo;
    })

E estou usando-a dessa forma:

<campo-obrigatorio mensagem="Esse campo é obrigatorio" formulario="formulario" campo="titulo"></campo-obrigatorio>

Só funciona se eu apenas usar o data-binding na mensagem. Por exemplo:

<span ng-show="formulario.$submitted && formulario.campo.$error.required" class="alert alert-info form-control">
    {{mensagem}}
</span>

E alterando todo o resto, para que a única propriedade que eu precise alterar seja a mensagem, mas eu gostaria de alterar as outras duas também.

Poderia me ajudar por favor?

Gosto muito das suas aulas!!

Abraço!

3 respostas

Fala aí Leonardo, tudo bem? Antes de tentar lhe ajudar e vermos o problema, gostaria de perguntar:

Porque você está fazendo o curso de Angular 1? O mesmo foi descontinuado pela Google, todo aprendizado com ele será jogado fora, pois, a partir da versão 2 o framework foi reescrito do zero.

Apenas recomendo caso haja a necessidade de dar manutenção em projetos legados, fora isso, já recomendaria começar no novo curso de Angular 6 que temos:

https://cursos.alura.com.br/course/angular-fundamentos

Espero ter ajudado.

Olá Matheus! Tudo sim e você?

Estou em um projeto na minha empresa que utiliza AngularJS. Por isso a necessidade de fazer o curso.

Abraço!

Oi Leonardo, tudo bem? Pra sua diretiva poder receber conteúdo dentro da tag, você precisa usar a opção transclude nela como informa a documentação: https://docs.angularjs.org/guide/directive na sessão "Creating a Directive that Wraps Other Elements".

Com ela, esse código deve funcionar:

<span ng-show="{{formulario}}.$submitted && {{formulario}}.{{campo}}.$error.required" class="alert alert-info form-control">
    {{mensagem}}
</span>

Primeiro o seu ddo precisa configurar o tranclude como true, e no template da sua diretiva, na tag que quiser interpolar o conteúdo, você usa a diretiva ng-transclude.

Deve ser só isso, verifica pra mim por favor?

Essa doc é do Angularjs 1.7, não sei se é exatamente essa que está usando.