Mit der ursprünglichen Möglichkeit, Controller zu definieren, war der Zugriff auf den Bereich des übergeordneten Objekts ziemlich trivial, da der untergeordnete Bereich prototypisch von seinem übergeordneten Element erbt.Zugriff auf geerbten Bereich mit Controller als Ansatz
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>
Die Regler-A Ansatz scheint der recommended Weg, um einen Controller zu erklären. Aber mit Controller-As funktioniert der obige Ansatz nicht mehr.
Sicher, kann ich den Umfang übergeordneten Zugriff mit pc.name
von der Aussicht:
<div ng-controller="parentCtrl as pc">
{{pc.name}}
<div ng-controller="childCtrl as cc">
{{cc.childName}}
</div>
</div>
habe ich einige Probleme mit diesem (Potenzial für Spaghetti-Code), aber diese Frage ist über den übergeordneten Bereich von dem Zugriff auf Kinder-Controller.
Die einzige Art, wie ich diese Arbeit sehen kann, ist:
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's no $scope.name
// and no $scope.$parent.name
});
So, jetzt muss das Kind Controller über „pc
“ wissen - außer, sollte dies (in meinem Kopf) auf die Ansicht eingeschränkt werden. Ich glaube nicht, dass ein Kind Controller wissen sollte über die Tatsache, dass eine Ansicht entschied, eine ng-controller="parentCtrl as pc"
zu deklarieren.
F: Was ist der richtige Ansatz dann?
EDIT:
Klarstellung: Ich bin auf der Suche keine übergeordnete Steuerung erben. Ich möchte den freigegebenen Bereich erben/ändern. Also, wenn ich das erste Beispiel zu ändern war, sollte ich in der Lage sein, Folgendes zu tun:
app.controller("parentCtrl", function($scope){
$scope.someObj = {prop: "not set"};
})
.controller("childCtrl", function($scope){
$scope.someObj.prop = "changed";
});
Angulars "Controller" sind eher ein "View Helper" oder ein "View Model". Die Styleguides, die vorschlagen, 'controllerAs' zu verwenden, ermutigen Sie aktiv,' pc' direkt zu verwenden oder diese Situation zu beschönigen. Ich nehme an, Sie könnten eine Vererbungskette zwischen "parentCtrl" und "childCtrl" einrichten, z. 'childCtrl.prototype = Object.create (parentCtrl.prototype)' und dann würde 'this.name' in Ihrem' childCtrl' -Konstruktor auf den Namen des Elternteils verweisen, bevor Sie ihn schattieren. – Sacho