Qual é a maneira mais fácil de passar uma variável de escopo AngularJS da diretiva para o controlador? Todos os exemplos que vi parecem tão complexos, não há uma maneira de acessar um controlador de uma diretiva e definir uma de suas variáveis ​​de escopo?
— brinquedo de vento
consulte stackoverflow.com/questions/17900201/… para mais informações
Editado em 25/08/2014: Aqui foi onde eu bifurcou.
Obrigado @anvarik.
Aqui está o JSFiddle . Eu esqueci onde eu bifurquei isso. Mas este é um bom exemplo que mostra a diferença entre = e @
Ótima explicação e exemplo! Eu me pergunto por que a documentação é tão complexa? ... Ou será que não sou um grande programador?
— kshep92
Observe que este violino funciona como em, mas se você alterar a versão angular para uma mais recente (ou seja, de 1.0.1 para 1.2.1), não funcionará mais. Algo deve ter mudado na sintaxe.
Finalmente, um exemplo claro que faz sentido. Dor de cabeça de 2h resolvida em 10 segundos.
Como é que todos votam nessa resposta enquanto o método explica como passar um valor do controlador para uma diretiva e não de uma diretiva para um controlador?
isolatedBindingFoo: '= bindingFoo' pode passar os dados da diretiva para o controlador. ou você pode usar o serviço. Antes de votar contra alguém, você pode perguntar primeiro se não entender.
Espere até que angular tenha avaliado a variável
Eu tinha mexido muito nisso e não consegui fazer funcionar mesmo com a variável definida "="no escopo. Aqui estão três soluções, dependendo da sua situação.
Descobri que a variável ainda não foi avaliada pelo angular quando foi passada para a diretiva. Isso significa que você pode acessá-lo e usá-lo no modelo, mas não dentro do link ou da função do controlador de aplicativo, a menos que esperemos que seja avaliado.
Se sua variável estiver mudando ou for obtida por meio de uma solicitação, você deve usar $observeou $watch:
E aqui está o html (lembre-se dos colchetes!):
Observe que você não deve definir a variável "="no escopo, se estiver usando a $observefunção. Além disso, descobri que ele passa objetos como strings, portanto, se você estiver passando objetos, use a solução 2 ou scope.$watch(attrs.yourDirective, fn)(ou 3 se a variável não estiver mudando).
Se sua variável for criada, por exemplo, em outro controlador , mas apenas precisar esperar até que o angular a avalie antes de enviá-la para o controlador de aplicativo, podemos $timeoutesperar até que $applyseja executado. Além disso, precisamos usar $emitpara enviá-lo ao controlador de aplicativo do escopo pai (devido ao escopo isolado na diretiva):
E aqui está o html (sem colchetes!):
Se sua variável não está mudando e você precisa avaliá-la em sua diretiva, você pode usar a $evalfunção:
Além disso, dê uma olhada nesta resposta: https://stackoverflow.com/a/12372494/1008519
Referência para o problema FOUC (flash de conteúdo não estilizado): http://deansofer.com/posts/view/14/AngularJs-Tips-and-Tricks-UPDATED
Para os interessados: aqui está um artigo sobre o ciclo de vida angular
— mlunoe
Às vezes, um simples ng-if="someObject.someVariable"na diretiva (ou o elemento com a diretiva como um atributo) é suficiente - a diretiva entra em ação somente após someObject.someVariableser definida.