113 votes

AngularJS - accès à la portée de l’enfant

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 faire s' parent lu b de child? S'il est nécessaire de définir b en parent, ne serait-ce pas rendre sémantiquement incorrect en supposant qu' b est une propriété qui décrit quelque chose lié à l' child et pas parent?

Mise à jour: Penser plus à ce sujet, si plus d'un enfant a b il serait de créer un conflit pour parent sur qui b pour récupérer. Ma question demeure de savoir quelle est la bonne manière d'accéder b de parent?

163voto

jaime Points 15538

Les étendues dans AngularJS utilisation prototypes héritage, lors de la recherche d'une propriété à un enfant que l'interprète va chercher le prototype de la chaîne à partir de l'enfant et de continuer à les parents jusqu'à ce qu'il trouve la propriété, et non l'inverse.

Vérifier Vojta commentaires sur la question https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J

En un mot: Vous ne pouvez pas accéder enfant étendues à partir d'un parent.

Vos solutions:

  1. Définir les propriétés de parents et d'y accéder depuis les enfants (lire le lien ci-dessus)
  2. L'utilisation d'un service d'action de l'état
  3. Transmettre des données à travers des événements. $emit envoie des événements vers le haut pour les parents jusqu'à la racine de la portée et de l' $broadcast distribue des événements à la baisse. Cela pourrait vous aider à garder les choses sémantiquement correct.

84voto

Jussi Kosunen Points 3253

Alors que jm-de réponse est la meilleure façon de gérer ce cas, pour un usage ultérieur, il est possible d’étendues d’enfants accès à l’aide de $ d’une portée $childHead, $$childTail, $$nextSibling et $$prevSibling membres. Elles ne sont pas documentées donc ils peuvent changer sans préavis, mais ils sont là si vous vraiment besoin de traverser des étendues.

Fiddle

2voto

Martijn Points 85

Aussi, assurez-vous que vous lisez ceci :

Quelles sont les nuances de l’héritage de prototypes / prototypique portée en AngularJS ?

Un aperçu très bon et approfondi des étendues et héritage en angularJS.

0voto

tkd_aj Points 42

Je ne suis pas sûr de savoir si ou de ne pas vous "doit" l'accès de l'enfant au parent, mais c'est possible. Je le sais parce que je l'ai fait moi-même. Voici mon scénario:

J'ai une fonction qui navigue dans mes pages par les modifications apportées à la chaîne dans une variable. Que cette variable est référencée dans les principaux index.html le fichier de ng-include. Ainsi, lorsque la chaîne est modifiée, un nouveau fichier html est chargé dans le ng-include. À l'intérieur de l'un de ces fichiers html, j'ai un autre ng-include. Pensez à ce que d'une petite fenêtre dans la première fenêtre. Chaque fois que je change le contenu de ces fenêtres, je les ai aussi modifier le contenu d'un panneau latéral. Ce panneau latéral est au niveau du parent. Mais, quand je vais dans la petite fenêtre à l'intérieur de l', le parent qui a le niveau le panneau latéral a des liens de navigation dans ce qui fait changer les choses au sein de la petite fenêtre. Depuis le panneau latéral est au niveau du parent et de la navigation de la fenêtre la plus petite est pris en charge dans son propre contrôleur au niveau enfant, quand je clique sur les liens sur le côté du panneau de il a à modifier le contrôleur enfant. Cela peut être une mauvaise programmation. Honnêtement, je ne sais pas. J'ai commencé avec angularjs il y a quelques mois et je suis toujours en apprentissage. Mais, pour le faire fonctionner pour mon scénario, j'ai fait une fonction dans la portée parent, qui est appelée lorsque l'enfant du champ d'application des charges:

function parent($scope, service) {
    setCurrentChildController = function (childScope) {
    this.$scope.childScope = childScope;
}
}

function child($scope) {
    scope.$parent.setCurrentChildController($scope);
}

si, maintenant, les parents de la portée de la variable $scope.childScope est essentiellement l'enfant du contrôleur de portée. Il a accès à toutes les variables et fonctions au sein de l'enfant. Si c'est la mauvaise programmation et n'importe qui peut venir avec une solution alternative au problème avec mon scénario, ce serait super. Mais, ce n'travail si nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X