La source
Différence entre la création d'un contrôleur à l'aide de $scope object
et l'utilisation de la “controller as”
syntaxe et de vm
Création d'un contrôleur à l'aide de l'objet $ scope
Habituellement, nous créons un contrôleur en utilisant l'objet $ scope comme indiqué dans la liste ci-dessous:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
Ci-dessus, nous créons l'AddController avec trois variables et un comportement, en utilisant le contrôleur d'objet $ scope et la vue, qui se parlent. L'objet $ scope est utilisé pour transmettre des données et un comportement à la vue. Il colle la vue et le contrôleur ensemble.
Essentiellement, l'objet $ scope effectue les tâches suivantes:
Passer les données du contrôleur à la vue
Passer le comportement du contrôleur à la vue
Colle le contrôleur et la vue ensemble
L'objet $ scope est modifié lorsqu'une vue change et une vue est modifiée lorsque les propriétés de l'objet $ scope changent
Nous attachons des propriétés à un objet $ scope pour transmettre des données et un comportement à la vue. Avant d'utiliser l'objet $ scope dans le contrôleur, nous devons le passer dans la fonction de contrôleur en tant que dépendances.
Utilisation de la syntaxe «controller as» et de vm
Nous pouvons réécrire le contrôleur ci-dessus en utilisant le contrôleur comme syntaxe et la variable vm comme indiqué dans la liste ci-dessous:
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;
}
});
Essentiellement, nous attribuons ceci à une variable vm, puis nous y attachons une propriété et un comportement. Sur la vue, nous pouvons accéder à AddVmController en utilisant le contrôleur comme syntaxe. Ceci est montré dans la liste ci-dessous:
<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>
Bien sûr, nous pouvons utiliser un autre nom que «vm» dans le contrôleur comme syntaxe. Sous le capot, AngularJS crée l'objet $ scope et attache les propriétés et le comportement. Cependant, en utilisant le contrôleur comme syntaxe, le code est très propre au niveau du contrôleur et seul le nom d'alias est visible sur la vue.
Voici quelques étapes pour utiliser le contrôleur comme syntaxe:
Créez un contrôleur sans objet $ scope.
Affectez-le à une variable locale. J'ai préféré le nom de variable comme vm, vous pouvez choisir n'importe quel nom de votre choix.
Attachez les données et le comportement à la variable vm.
Sur la vue, donnez un alias au contrôleur en utilisant le contrôleur comme syntaxe.
Vous pouvez donner n'importe quel nom à l'alias. Je préfère utiliser vm sauf si je ne travaille pas avec des contrôleurs imbriqués.
Lors de la création du contrôleur, il n'y a pas d'avantages ou d'inconvénients directs à utiliser l'approche objet $ scope ou le contrôleur comme syntaxe. C'est purement une question de choix, cependant, l'utilisation du contrôleur comme syntaxe rend le code JavaScript du contrôleur plus lisible et évite tout problème lié à ce contexte.
Contrôleurs imbriqués dans l'approche objet $ scope
Nous avons deux contrôleurs comme indiqué dans la liste ci-dessous:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
La propriété «age» se trouve à l'intérieur des deux contrôleurs, et sur la vue, ces deux contrôleurs peuvent être imbriqués comme indiqué dans la liste ci-dessous:
<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>
Comme vous le voyez, pour accéder à la propriété age du contrôleur parent, nous utilisons le $ parent.age. La séparation des contextes n'est pas très claire ici. Mais en utilisant le contrôleur comme syntaxe, nous pouvons travailler avec des contrôleurs imbriqués d'une manière plus élégante. Disons que nous avons des contrôleurs comme indiqué dans la liste ci-dessous:
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";
});
Sur la vue, ces deux contrôleurs peuvent être imbriqués comme indiqué dans la liste ci-dessous:
<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>
Dans le contrôleur comme syntaxe, nous avons un code plus lisible et la propriété parent est accessible en utilisant le nom d'alias du contrôleur parent au lieu d'utiliser la syntaxe $ parent.
Je conclurai cet article en disant que c'est uniquement à vous de choisir si vous voulez utiliser le contrôleur comme syntaxe ou l'objet $ scope. Il n'y a ni avantage ni inconvénient énorme, simplement que le contrôleur en tant que syntaxe que vous contrôlez sur le contexte est un peu plus facile à utiliser, étant donné la séparation claire des contrôleurs imbriqués sur la vue.