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?
angularjs
angularjs-directive
ng-controller
brinquedo de vento
fonte
fonte
Respostas:
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 @
fonte
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.Solução # 1
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
$observe
ou$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$observe
função. Além disso, descobri que ele passa objetos como strings, portanto, se você estiver passando objetos, use a solução 2 ouscope.$watch(attrs.yourDirective, fn)
(ou 3 se a variável não estiver mudando).Solução # 2
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
$timeout
esperar até que$apply
seja executado. Além disso, precisamos usar$emit
para enviá-lo ao controlador de aplicativo do escopo pai (devido ao escopo isolado na diretiva):E aqui está o html (sem colchetes!):
Solução # 3
Se sua variável não está mudando e você precisa avaliá-la em sua diretiva, você pode usar a
$eval
função:E aqui está o html (lembre-se dos colchetes!):
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
fonte
ng-if="someObject.someVariable"
na diretiva (ou o elemento com a diretiva como um atributo) é suficiente - a diretiva entra em ação somente apóssomeObject.someVariable
ser definida.