Обновить родительскую переменную области

У меня есть два контроллера, один из которых завернут в другой. Теперь я знаю, что область child наследует свойства из родительской области, но есть ли способ обновить переменную родительской области? До сих пор я не встречал никаких очевидных решений.

В моей ситуации у меня есть контроллер календаря в форме. Я хотел бы обновить даты начала и окончания из родительской области (которая является формой), чтобы форма давала дату начала и окончания при отправке.

Ответ 1

Вам нужно использовать объект (а не примитив) в родительской области, а затем вы сможете обновить его непосредственно из области содержимого

Родитель:

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

Ребенок:

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";
});

Рабочая демонстрация: http://jsfiddle.net/sh0ber/xxNxj/

Смотрите Каковы нюансы объема прототипа/прототипного наследования в AngularJS?

Ответ 2

Есть еще один способ выполнить эту задачу и не использовать переменную $scope.$parent.

Просто подготовьте метод изменения значения в родительской области и используйте его в дочернем. Вот так:

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

app.controller('ctrlChild',function($scope){
    $scope.changeSimpleValue('y');
});

Он также работает и дает вам больше контроля над изменениями значений.

Вы также можете вызвать метод даже в HTML, например: <a ng-click="changeSimpleValue('y')" href="#">click me!</a>.

Ответ 3

Это также работает (но не уверен, что это следует за лучшей практикой или нет)

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

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

Ответ 4

Когда вы назначаете примитивный атрибут для области видимости, он всегда является локальным для области (возможно, созданной "на лету" ), даже если родительская область имеет атрибут с тем же именем. Это дизайнерское решение, и хороший IMHO.

Если вам нужно изменить некоторые примитивы (ints, booleans, strings) в родительской области, из представления вам нужно, чтобы это был атрибут другого объекта в этой области, поэтому назначение может читать:

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

и он будет, в свою очередь:

  • получить объект viewData из любой области, определенной в
  • назначить 4 его атрибуту myAttr.

Ответ 5

Для доступа к переменным, объявленным в родительском, мы должны использовать $parent в дочернем контроллере или файле шаблона

В контроллере

$scope.$parent.varaiable_name

В шаблоне html

ng-model="$parent.varaiable_name"