Si j'ai les contrôleurs suivants:
function parent($scope, service) {
$scope.a = 'foo';
$scope.save = function() {
service.save({
a: $scope.a,
b: $scope.b
});
}
}
function child($scope) {
$scope.b = 'bar';
}
Quelle est la bonne façon de laisser sortir la parent
lecture ? S'il est nécessaire de définir dans , cela ne le rendrait-il pas sémantiquement incorrect en supposant qu'il s'agit d'une propriété qui décrit quelque chose lié à et non ?b
child
b
parent
b
child
parent
Mise à jour: en y réfléchissant plus loin, si plus d'un enfant en avait, b
cela créerait un conflit pour parent
lequel b
récupérer. Ma question demeure, quelle est la bonne façon d'accéder à b
partir parent
?
Réponses:
Les étendues dans AngularJS utilisent l'héritage prototypique, lors de la recherche d'une propriété dans une étendue enfant, l'interpréteur recherchera la chaîne prototype à partir de l'enfant et continuera jusqu'aux parents jusqu'à ce qu'il trouve la propriété, et non l'inverse.
Consultez les commentaires de Vojta sur le problème https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J
En un mot: vous ne pouvez pas accéder aux étendues enfants à partir d'une étendue parent.
Vos solutions:
$emit
envoie les événements vers le haut aux parents jusqu'à la portée racine et$broadcast
distribue les événements vers le bas. Cela peut vous aider à garder les choses sémantiquement correctes.la source
localStorage
avec une dépendance commengStorage
.Bien que la réponse de jm- soit la meilleure façon de gérer ce cas, pour référence future, il est possible d'accéder aux portées enfants en utilisant les membres $$ childHead, $$ childTail, $$ nextSibling et $$ prevSibling d'une portée. Ceux-ci ne sont pas documentés, ils peuvent donc changer sans préavis, mais ils sont là si vous avez vraiment besoin de parcourir les étendues.
Violon
la source
Vous pouvez essayer ceci:
puis dans le contrôleur enfant (portée), ajoutez:
Le parent a maintenant accès à la portée de l'enfant.
la source
Une solution de contournement possible consiste à injecter le contrôleur enfant dans le contrôleur parent à l'aide d'une fonction init.
Implémentation possible:
Où en
ChildController
vous avez:Alors maintenant,
ParentController
vous pouvez utiliser:Important:
pour fonctionner correctement, vous devez utiliser la directive
ng-controller
et renommer chaque contrôleur en utilisantas
comme je l'ai fait dans le html, par exemple.Conseils:
utilisez le plugin chrome ng-inspector pendant le processus. Cela vous aidera à comprendre l'arbre.
la source
Utilisation de $ emit et $ broadcast , (comme mentionné par walv dans les commentaires ci-dessus)
Pour déclencher un événement vers le haut (de l'enfant au parent)
Pour déclencher un événement vers le bas (du parent à l'enfant)
et enfin écouter
Pour plus de détails: - https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Prendre plaisir :)
la source
Oui, nous pouvons affecter des variables du contrôleur enfant aux variables du contrôleur parent. Voici un moyen possible:
Vue d'ensemble: Le but principal du code, ci-dessous, est d'affecter $ scope.variable du contrôleur enfant au $ scope.assign du contrôleur parent
Explication: Il existe deux contrôleurs. Dans le html, notez que le contrôleur parent renferme le contrôleur enfant. Cela signifie que le contrôleur parent sera exécuté avant le contrôleur enfant. Ainsi, d'abord setValue () sera défini, puis le contrôle ira au contrôleur enfant. $ scope.variable sera assigné comme "enfant". Ensuite, cette portée enfant sera passée en argument à la fonction du contrôleur parent, où $ scope.assign obtiendra la valeur comme "enfant"
la source