Fuente
Diferencia entre crear un controlador usando $scope objecty usar la “controller as”sintaxis y vm
Crear un controlador usando el objeto $ scope
Por lo general, creamos un controlador utilizando el objeto $ scope como se muestra en la lista a continuación:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
Arriba estamos creando el AddController con tres variables y un comportamiento, usando el controlador y la vista de objeto $ scope, que se comunican entre sí. El objeto $ scope se usa para pasar datos y comportamiento a la vista. Pega la vista y el controlador juntos.
Esencialmente, el objeto $ scope realiza las siguientes tareas:
Pase datos del controlador a la vista
Pase el comportamiento del controlador a la vista
Pega el controlador y visualiza juntos
El objeto $ scope se modifica cuando cambia una vista y una vista se modifica cuando cambian las propiedades del objeto $ scope
Adjuntamos propiedades a un objeto $ scope para pasar datos y comportamiento a la vista. Antes de usar el objeto $ scope en el controlador, necesitamos pasarlo en la función del controlador como dependencias.
Uso de la sintaxis "controlador como" y vm
Podemos reescribir el controlador anterior usando el controlador como sintaxis y la variable vm como se muestra en la lista a continuación:
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;
}
});
Esencialmente, estamos asignando esto a una variable vm y luego adjuntamos una propiedad y comportamiento a eso. En la vista podemos acceder al AddVmController usando el controlador como sintaxis. Esto se muestra en el listado a continuación:
<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>
Por supuesto, podemos usar otro nombre que "vm" en el controlador como sintaxis. Bajo el capó, AngularJS crea el objeto $ scope y adjunta las propiedades y el comportamiento. Sin embargo, al usar el controlador como sintaxis, el código es muy limpio en el controlador y solo el nombre del alias es visible en la vista.
Estos son algunos pasos para usar el controlador como sintaxis:
Cree un controlador sin objeto $ scope.
Asigne esto a una variable local. Preferí el nombre de la variable como vm, puede elegir el nombre que prefiera.
Adjunte datos y comportamiento a la variable vm.
En la vista, asigne un alias al controlador utilizando el controlador como sintaxis.
Puede dar cualquier nombre al alias. Prefiero usar VM a menos que no esté trabajando con controladores anidados.
Al crear el controlador, no hay ventajas o desventajas directas de utilizar el enfoque de objeto $ scope o el controlador como sintaxis. Sin embargo, es puramente una elección, usar el controlador como sintaxis hace que el código JavaScript del controlador sea más legible y evita cualquier problema relacionado con este contexto.
Controladores anidados en el enfoque de objeto $ scope
Tenemos dos controladores como se muestra en el listado a continuación:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
La propiedad "edad" está dentro de ambos controladores, y en la vista estos dos controladores se pueden anidar como se muestra en la siguiente lista:
<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>
Como puede ver, para acceder a la propiedad de edad del controlador principal estamos usando $ parent.age. La separación del contexto no está muy clara aquí. Pero usando el controlador como sintaxis, podemos trabajar con controladores anidados de una manera más elegante. Digamos que tenemos controladores como se muestra en la lista a continuación:
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";
});
En la vista, estos dos controladores se pueden anidar como se muestra en la lista a continuación:
<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>
En el controlador como sintaxis, tenemos un código más legible y se puede acceder a la propiedad principal utilizando el nombre de alias del controlador principal en lugar de utilizar la sintaxis $ parent.
Concluiré esta publicación diciendo que es puramente su elección si desea usar el controlador como sintaxis o el objeto $ scope. Tampoco hay una gran ventaja o desventaja, simplemente que el controlador como sintaxis que tiene control sobre el contexto es un poco más fácil de trabajar, dada la clara separación en los controladores anidados en la vista.