In a parent controller scope, I have defined selectedItem
which is set to 'x'. Then in the child scope, I have defined selectedItem
using ngModel:
<div ng-app>
<div ng-controller="CtrlA">
<div ng-controller="CtrlB">
<select ng-model="selectedItem" ng-options="item for item in items">
</select>
</div>
</div>
</div>
function CtrlA($scope) {
$scope.selectedItem = 'x';
$scope.items = ['x', 'y'];
}
function CtrlB($scope) {}
When the page is loaded, the selectedItem
is properly set to 'x' as expected. When I select 'y', selectedItem
in CtrlB $scope gives 'y' as expected.
But when I inspect $scope.selectedItem
in CtrlA
scope (using AngularJS's batarang), it gives 'x' .
jsFiddle: http://jsfiddle.net/sudhh/GGKjp/2/
Preview page: http://fiddle.jshell.net/sudhh/GGKjp/2/show/light/ (for inspecting with angularjs batarang)
Why is $scope.selectedItem
in CtrlA
scope not getting updated to 'y'? What is the explanation?
I prefer not to use events or rootScope
to update selectedItem
in parent scope (for learning purposes).
If you try to bind to a primitive declared on parent scope, then the selectedItem in child scope will effectively shadow the property of the same name in the parent scope.
In this case there are 3 choices
More about it on https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance
You can find the updated fiddle using the first approach at http://jsfiddle.net/sudhh/XU2rP/1/
function CtrlA($scope) {
$scope.items = ['x', 'y'];
$scope.ref = {
selectedItem: 'x'
};
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With