fonte
Differenza tra la creazione di un controller utilizzando $scope objecte utilizzando la “controller as”sintassi e vm
Creazione di un controller utilizzando l'oggetto $ scope
Di solito creiamo un controller utilizzando l'oggetto $ scope come mostrato nell'elenco seguente:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
Sopra stiamo creando l'AddController con tre variabili e un comportamento, usando il $ scope object controller e la vista, che dialogano tra loro. L'oggetto $ scope viene utilizzato per trasmettere dati e comportamento alla vista. Incolla la vista e il controller insieme.
Essenzialmente l'oggetto $ scope esegue le seguenti attività:
Passa i dati dal controller alla visualizzazione
Passa il comportamento dal controller alla vista
Incolla il controller e la vista insieme
L'oggetto $ scope viene modificato quando una vista cambia e una vista viene modificata quando le proprietà dell'oggetto $ scope cambiano
Alleghiamo proprietà a un oggetto $ scope per passare dati e comportamento alla vista. Prima di utilizzare l'oggetto $ scope nel controller, è necessario passarlo nella funzione controller come dipendenze.
Utilizzando la sintassi "controller as" e vm
Possiamo riscrivere il controller sopra usando il controller come sintassi e la variabile vm come mostrato nell'elenco seguente:
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;
}
});
Essenzialmente lo stiamo assegnando a una variabile vm e quindi alleghiamo una proprietà e un comportamento a quella. Nella vista possiamo accedere all'AddVmController usando il controller come sintassi. Questo è mostrato nell'elenco seguente:
<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>
Ovviamente possiamo usare un nome diverso da "vm" nel controller come sintassi. Dietro le quinte, AngularJS crea l'oggetto $ scope e allega le proprietà e il comportamento. Tuttavia, utilizzando il controller come sintassi, il codice è molto pulito nel controller e solo il nome alias è visibile nella vista.
Di seguito sono riportati alcuni passaggi per utilizzare il controller come sintassi:
Crea un controller senza oggetto $ scope.
Assegnalo a una variabile locale. Ho preferito il nome della variabile come vm, puoi scegliere qualsiasi nome a tua scelta.
Allega dati e comportamento alla variabile vm.
Nella vista, assegna un alias al controller utilizzando il controller come sintassi.
Puoi dare qualsiasi nome all'alias. Preferisco usare VM a meno che non stia lavorando con controller annidati.
Nella creazione del controller, non ci sono vantaggi o svantaggi diretti nell'usare l'approccio all'oggetto $ scope o il controller come sintassi. È puramente una questione di scelta, tuttavia, l'utilizzo del controller come sintassi rende il codice JavaScript del controller più leggibile e previene qualsiasi problema relativo a questo contesto.
Controller annidati nell'approccio agli oggetti $ scope
Abbiamo due controller come mostrato nell'elenco seguente:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
La proprietà "età" è all'interno di entrambi i controller e nella vista questi due controller possono essere nidificati come mostrato nell'elenco seguente:
<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>
Come puoi vedere, per accedere alla proprietà age del controllore genitore stiamo usando $ parent.age. La separazione del contesto non è molto chiara qui. Ma usando il controller come sintassi, possiamo lavorare con controller annidati in un modo più elegante. Supponiamo di avere controller come mostrato nell'elenco seguente:
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";
});
Nella vista questi due controller possono essere annidati come mostrato nell'elenco seguente:
<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>
Nel controller come sintassi, abbiamo un codice più leggibile ed è possibile accedere alla proprietà padre utilizzando il nome alias del controller padre invece di utilizzare la sintassi $ parent.
Concluderò questo post dicendo che è puramente una tua scelta se vuoi usare il controller come sintassi o l'oggetto $ scope. Non c'è alcun enorme vantaggio o svantaggio in nessuno dei due, semplicemente che il controller come sintassi che hai il controllo sul contesto è un po 'più facile da lavorare, data la netta separazione nei controller annidati nella vista.