Quelle
Unterschied zwischen dem Erstellen eines Controllers mit $scope object
der “controller as”
Syntax und vm
Erstellen eines Controllers mit dem Objekt $ scope
Normalerweise erstellen wir einen Controller mit dem $ scope-Objekt, wie in der folgenden Liste gezeigt:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
Oben erstellen wir den AddController mit drei Variablen und einem Verhalten unter Verwendung des $ scope-Objektcontrollers und der Ansicht, die miteinander kommunizieren. Das $ scope-Objekt wird verwendet, um Daten und Verhalten an die Ansicht zu übergeben. Es klebt die Ansicht und den Controller zusammen.
Im Wesentlichen führt das $ scope-Objekt die folgenden Aufgaben aus:
Übergeben Sie Daten vom Controller an die Ansicht
Übergeben Sie das Verhalten vom Controller an die Ansicht
Klebt den Controller und die Ansicht zusammen
Das $ scope-Objekt wird geändert, wenn sich eine Ansicht ändert, und eine Ansicht wird geändert, wenn sich die Eigenschaften des $ scope-Objekts ändern
Wir hängen Eigenschaften an ein $ scope-Objekt an, um Daten und Verhalten an die Ansicht zu übergeben. Bevor Sie das $ scope-Objekt im Controller verwenden, müssen Sie es in der Controller-Funktion als Abhängigkeiten übergeben.
Verwenden der Syntax "controller as" und vm
Wir können den obigen Controller unter Verwendung des Controllers als Syntax und der VM-Variablen wie in der folgenden Liste gezeigt umschreiben:
myApp.controller("AddVMController", function () {
var vm = this;
vm.number1 = undefined;
vm.number2=undefined;
vm.result =undefined;
vm.add = function () {
vm.result = vm.number1 + vm.number2;
}
});
Im Wesentlichen weisen wir dies einer Variablen vm zu und fügen dieser dann eine Eigenschaft und ein Verhalten hinzu. In der Ansicht können wir mit Controller als Syntax auf den AddVmController zugreifen. Dies wird in der folgenden Liste gezeigt:
<div ng-controller="AddVMController as vm">
<input ng-model="vm.number1" type="number" />
<input ng-model="vm.number2" type="number" />
<button class="btn btn-default" ng-click="vm.add()">Add</button>
<h3>{{vm.result}}</h3>
</div>
Natürlich können wir im Controller einen anderen Namen als "vm" als Syntax verwenden. Unter der Haube erstellt AngularJS das $ scope-Objekt und hängt die Eigenschaften und das Verhalten an. Wenn Sie jedoch den Controller als Syntax verwenden, ist der Code auf dem Controller sehr sauber und nur der Aliasname ist in der Ansicht sichtbar.
Hier sind einige Schritte, um den Controller als Syntax zu verwenden:
Erstellen Sie einen Controller ohne $ scope-Objekt.
Weisen Sie dies einer lokalen Variablen zu. Ich habe den Variablennamen als vm bevorzugt. Sie können einen beliebigen Namen Ihrer Wahl wählen.
Hängen Sie Daten und Verhalten an die Variable vm an.
Geben Sie in der Ansicht dem Controller einen Alias, indem Sie den Controller als Syntax verwenden.
Sie können dem Alias einen beliebigen Namen geben. Ich bevorzuge die Verwendung von VM, es sei denn, ich arbeite nicht mit verschachtelten Controllern.
Beim Erstellen des Controllers gibt es keine direkten Vor- oder Nachteile der Verwendung des $ scope-Objektansatzes oder des Controllers als Syntax. Es ist jedoch nur eine Frage der Wahl, ob die Verwendung des Controllers als Syntax den JavaScript-Code des Controllers besser lesbar macht und Probleme im Zusammenhang mit diesem Kontext verhindert.
Verschachtelte Controller im $ scope-Objektansatz
Wir haben zwei Controller, wie in der folgenden Liste gezeigt:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
Die Eigenschaft "Alter" befindet sich in beiden Controllern. In der Ansicht können diese beiden Controller wie in der folgenden Liste gezeigt verschachtelt werden:
<div ng-controller="ParentController">
<h2>Name :{{name}} </h2>
<h3>Age:{{age}}</h3>
<div ng-controller="ChildController">
<h2>Parent Name :{{name}} </h2>
<h3>Parent Age:{{$parent.age}}</h3>
<h3>Child Age:{{age}}</h3>
<h3>Country:{{country}}</h3>
</div>
</div>
Wie Sie sehen, verwenden wir für den Zugriff auf die age-Eigenschaft des übergeordneten Controllers die Datei $ parent.age. Die Kontexttrennung ist hier nicht sehr klar. Mit dem Controller als Syntax können wir jedoch eleganter mit verschachtelten Controllern arbeiten. Nehmen wir an, wir haben Controller wie in der folgenden Liste gezeigt:
myApp.controller("ParentVMController", function () {
var vm = this;
vm.name = "DJ";
vm.age = 32;
});
myApp.controller("ChildVMController", function () {
var vm = this;
vm.age = 22;
vm.country = "India";
});
In der Ansicht können diese beiden Controller wie in der folgenden Liste gezeigt verschachtelt werden:
<div ng-controller="ParentVMController as parent">
<h2>Name :{{parent.name}} </h2>
<h3>Age:{{parent.age}}</h3>
<div ng-controller="ChildVMController as child">
<h2>Parent Name :{{parent.name}} </h2>
<h3>Parent Age:{{parent.age}}</h3>
<h3>Child Age:{{child.age}}</h3>
<h3>Country:{{child.country}}</h3>
</div>
</div>
Im Controller als Syntax haben wir besser lesbaren Code und auf die übergeordnete Eigenschaft kann mit dem Aliasnamen des übergeordneten Controllers zugegriffen werden, anstatt mit der übergeordneten Syntax $.
Ich werde diesen Beitrag mit der Aussage abschließen, dass es nur Ihre Wahl ist, ob Sie den Controller als Syntax oder das $ scope-Objekt verwenden möchten. Es gibt auch keinen großen Vor- oder Nachteil, einfach, dass der Controller als Syntax, die Sie im Kontext steuern können, etwas einfacher zu handhaben ist, da die verschachtelten Controller in der Ansicht klar voneinander getrennt sind.