Mettre à jour la variable de portée parentale

J'ai deux contrôleurs un enveloppé dans un autre. Maintenant, je sais que la portée de l'enfant hérite des propriétés de la portée parent, mais existe-t-il un moyen de mettre à jour la variable de portée parentale? Jusqu'à présent, je n'ai rencontré aucune solution évidente.

Dans ma situation, j'ai un contrôleur de calendrier sous une forme. Je souhaite mettre à jour les dates de début et de fin de la portée parent (quel est le formulaire) afin que le formulaire ait les dates de début et de fin lors de la soumission.

Vous devez utiliser un objet (pas une primitive) dans la portée parent, puis vous pourrez le mettre à jour directement à partir de la portée de l'enfant

Parent:

app.controller('ctrlParent',function($scope){ $scope.parentprimitive = "someprimitive"; $scope.parentobj = {}; $scope.parentobj.parentproperty = "someproperty"; }); 

Enfant:

 app.controller('ctrlChild',function($scope){ $scope.parentprimitive = "this will NOT modify the parent"; //new child scope variable $scope.parentobj.parentproperty = "this WILL modify the parent"; }); 

Démonstration de travail : http://jsfiddle.net/sh0ber/xxNxj/

Voir Quelles sont les nuances de l'héritage prototypique / prototypique de portée dans AngularJS?

Il existe une autre façon de faire cette tâche et de ne pas utiliser la variable $scope.$parent Variable $scope.$parent .

Il suffit de préparer une méthode pour changer la valeur dans la portée parentale et l'utiliser dans l'enfant. Comme ça:

 app.controller('ctrlParent',function($scope) { $scope.simpleValue = 'x'; $scope.changeSimpleValue = function(newVal) { $scope.simpleValue = newVal; }; }); app.controller('ctrlChild',function($scope){ $scope.changeSimpleValue('y'); }); 

Il fonctionne également et vous donne plus de contrôle sur les changements de valeur.

Vous pouvez également appeler la méthode même en HTML comme: <a ng-click="changeSimpleValue('y')" href="#">click me!</a> .

Cela fonctionne également (mais pas sûr de savoir si cela suit la meilleure pratique ou non)

 app.controller('ctrlParent',function($scope) { $scope.simpleValue = 'x'; }); app.controller('ctrlChild',function($scope){ $scope.$parent.simpleValue = 'y'; }); 

Lorsque vous attribuez un attribut primitif à une portée, il est toujours local à la portée (éventuellement créé à la volée), même si une portée parent possède un attribut portant le même nom. C'est une décision de conception, et une bonne IMHO.

Si vous devez modifier certains éléments primitifs (ints, booleans, strings) dans la portée parent, à partir de la vue, vous devez être un attribut d'un autre objet dans cette zone, de sorte que l'affectation peut être lue:

 <a ng-click="viewData.myAttr = 4">Click me!</a> 

Et ce sera, à son tour:

  1. Obtenir l'objet viewData de n'importe quelle étendue définie dans
  2. myAttr 4 à son attribut myAttr .

Pour accéder aux variables déclarées dans le parent, nous devrions utiliser $ parent dans le contrôleur enfant ou le fichier modèle

Dans le contrôleur

 $scope.$parent.varaiable_name 

En modèle html

 ng-model="$parent.varaiable_name"