Обновить родительскую переменную области
У меня есть два контроллера, один из которых завернут в другой. Теперь я знаю, что область 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"