Se eu tiver os seguintes controladores:
function parent($scope, service) {
$scope.a = 'foo';
$scope.save = function() {
service.save({
a: $scope.a,
b: $scope.b
});
}
}
function child($scope) {
$scope.b = 'bar';
}
O que é a maneira correta para deixar parent
ler b
fora child
? Se for necessário definir b
em parent
, isso não tornaria semanticamente incorreto assumir que b
é uma propriedade que descreve algo relacionado child
e não parent
?
Update: Pensando mais sobre isso, se mais de uma criança teve b
que iria criar um conflito para parent
em que b
para recuperar. Meus questão permanece, o que é a maneira correta de acesso b
a partir de parent
?
Respostas:
Os escopos em AngularJS usam herança prototípica. Ao pesquisar uma propriedade em um escopo filho, o interpretador pesquisará a cadeia de protótipos começando do filho e continuará até os pais até encontrar a propriedade, e não o contrário.
Verifique os comentários da Vojta sobre o problema https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J
Resumindo: você não pode acessar escopos filho de um escopo pai.
Suas soluções:
$emit
envia eventos para cima para os pais até o escopo raiz e$broadcast
despacha eventos para baixo. Isso pode ajudá-lo a manter as coisas semanticamente corretas.fonte
localStorage
com uma dependência comongStorage
.Embora a resposta de jm-seja a melhor maneira de lidar com esse caso, para referência futura, é possível acessar escopos filho usando os membros $$ childHead, $$ childTail, $$ nextSibling e $$ prevSibling de um escopo. Eles não estão documentados, portanto, podem ser alterados sem aviso prévio, mas estarão lá se você realmente precisar percorrer os escopos.
Violino
fonte
Você pode tentar isto:
em seguida, no controlador filho (escopo), adicione:
Agora o pai tem acesso ao escopo do filho.
fonte
Uma possível solução alternativa é injetar o controlador filho no controlador pai usando uma função init.
Implementação possível:
Onde
ChildController
você tem:Agora no
ParentController
você pode usar:Importante:
Para funcionar corretamente você tem que usar a diretiva
ng-controller
e renomear cada controlador usandoas
como eu fiz no html, por exemplo.Dicas:
Use o inspetor-ng do plugin do Chrome durante o processo. Isso vai te ajudar a entender a árvore.
fonte
Usando $ emit e $ broadcast (conforme mencionado por walv nos comentários acima)
Para disparar um evento para cima (de filho para pai)
Para disparar um evento para baixo (de pai para filho)
e finalmente ouvir
Para mais detalhes: - https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Aproveitar :)
fonte
Sim, podemos atribuir variáveis do controlador filho às variáveis do controlador pai. Esta é uma maneira possível:
Visão geral: O objetivo principal do código, abaixo, é atribuir $ scope.variable do controlador filho a $ scope.assign do controlador pai
Explicação: Existem dois controladores. No html, observe que o controlador pai inclui o controlador filho. Isso significa que o controlador pai será executado antes do controlador filho. Portanto, primeiro setValue () será definido e, em seguida, o controle irá para o controlador filho. $ scope.variable será atribuído como "filho". Então, esse escopo filho será passado como um argumento para a função do controlador pai, onde $ scope.assign obterá o valor como "filho"
fonte