Fonte
Diferença entre Criando um Controlador Usando o $scope objecte Usando a “controller as”Sintaxe e VM
Criando um controlador usando o objeto $ scope
Geralmente, criamos um controlador usando o objeto $ scope, como mostra a listagem abaixo:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
Acima, estamos criando o AddController com três variáveis e um comportamento, usando o controlador de objeto $ scope e a exibição, que se comunicam. O objeto $ scope é usado para passar dados e comportamento para a exibição. Cola a vista e o controlador juntos.
Essencialmente, o objeto $ scope executa as seguintes tarefas:
Passar dados do controlador para a visualização
Passar o comportamento do controlador para a visualização
Cola o controlador e vê juntos
O objeto $ scope é modificado quando uma exibição é alterada e uma exibição é modificada quando as propriedades do objeto $ scope são alteradas
Anexamos propriedades a um objeto $ scope para transmitir dados e comportamento à exibição. Antes de usar o objeto $ scope no controlador, precisamos passá-lo na função do controlador como dependências.
Usando a sintaxe "controller as" e vm
Podemos reescrever o controlador acima usando o controlador como sintaxe e a variável vm como mostrado na listagem abaixo:
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;
}
});
Essencialmente, estamos atribuindo isso a uma variável vm e, em seguida, anexando uma propriedade e um comportamento a isso. Na visualização, podemos acessar o AddVmController usando o controlador como sintaxe. Isso é mostrado na lista abaixo:
<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>
É claro que podemos usar outro nome que não “vm” no controlador como sintaxe. Sob o capô, o AngularJS cria o objeto $ scope e anexa as propriedades e o comportamento. No entanto, usando o controlador como sintaxe, o código é muito limpo no controlador e apenas o nome alternativo é visível na exibição.
Aqui estão algumas etapas para usar o controlador como sintaxe:
Crie um controlador sem o objeto $ scope.
Atribua isso a uma variável local. Eu preferi o nome da variável como vm, você pode escolher qualquer nome de sua escolha.
Anexe dados e comportamento à variável vm.
Na exibição, forneça um alias ao controlador usando o controlador como sintaxe.
Você pode atribuir qualquer nome ao alias. Prefiro usar vm, a menos que não esteja trabalhando com controladores aninhados.
Ao criar o controlador, não há vantagens diretas ou desvantagens de usar a abordagem de objeto $ scope ou o controlador como sintaxe. É apenas uma questão de escolha, no entanto, usar o controlador como sintaxe torna o código JavaScript do controlador mais legível e evita problemas relacionados a esse contexto.
Controladores aninhados na abordagem de objeto $ scope
Temos dois controladores, conforme mostrado na lista abaixo:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
A propriedade "age" está dentro de ambos os controladores e, na exibição, esses dois controladores podem ser aninhados conforme mostrado na listagem abaixo:
<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 você vê, para acessar a propriedade age do controlador pai, estamos usando o $ parent.age. A separação de contexto não é muito clara aqui. Mas, usando o controlador como sintaxe, podemos trabalhar com controladores aninhados de uma maneira mais elegante. Digamos que temos controladores, conforme mostrado na listagem abaixo:
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";
});
Na exibição, esses dois controladores podem ser aninhados, conforme mostrado na listagem abaixo:
<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>
No controlador como sintaxe, temos um código mais legível e a propriedade pai pode ser acessada usando o nome alternativo do controlador pai em vez de usar a sintaxe $ parent.
Concluirei este post dizendo que é puramente sua escolha se você deseja usar o controlador como sintaxe ou o objeto $ scope. Também não há grande vantagem ou desvantagem, simplesmente que o controlador como sintaxe que você controla no contexto é um pouco mais fácil de trabalhar, dada a clara separação nos controladores aninhados na exibição.