С исходным способом определения контроллеров доступ к родительской области был довольно тривиальным, так как область содержимого прототипа наследует его родителя.
app.controller("parentCtrl", function($scope){
$scope.name = "Parent";
})
.controller("childCtrl", function($scope){
$scope.childName = "child of " + $scope.name;
});
<div ng-controller="parentCtrl">
{{name}}
<div ng-controller="childCtrl">
{{childName}}
</div>
</div>
Подход с помощью Controller-As представляется рекомендуемым, чтобы объявить контроллер. Но с помощью Controller-As вышеупомянутый подход больше не работает.
Конечно, я могу получить доступ к родительской области с помощью pc.name
из представления:
<div ng-controller="parentCtrl as pc">
{{pc.name}}
<div ng-controller="childCtrl as cc">
{{cc.childName}}
</div>
</div>
У меня есть некоторые проблемы с этим (потенциал для кода спагетти), но этот вопрос касается доступа к родительской области с дочернего контроллера.
Единственный способ, которым я вижу это, - это:
app.controller("parentCtrl", function(){
this.name = "parent";
})
.controller("childCtrl", function($scope){
$scope.pc.name = "child of " + $scope.name;
// or
$scope.$parent.pc.name = "child of " + $scope.name;
// there no $scope.name
// and no $scope.$parent.name
});
Итак, теперь дочерний контроллер должен знать о "pc
" - за исключением того, что это должно (на мой взгляд) ограничиваться представлением. Я не думаю, что дочерний контроллер должен знать о том, что представление решило объявить ng-controller="parentCtrl as pc"
.
Q: Какой правильный подход?
EDIT:
Уточнение: я не хочу наследовать родительский контроллер. Я ищу для наследования/изменения общей области. Поэтому, если бы я исправил первый пример, я должен был бы сделать следующее:
app.controller("parentCtrl", function($scope){
$scope.someObj = {prop: "not set"};
})
.controller("childCtrl", function($scope){
$scope.someObj.prop = "changed";
});