Источник
Разница между созданием контроллера с использованием $scope object
и использованием “controller as”
синтаксиса и vm
Создание контроллера с использованием объекта $ scope
Обычно мы создаем контроллер, используя объект $ scope, как показано в листинге ниже:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
Выше мы создаем AddController с тремя переменными и одним поведением, используя контроллер объекта $ scope и представление, которые взаимодействуют друг с другом. Объект $ scope используется для передачи данных и поведения представлению. Он склеивает представление и контроллер вместе.
По сути, объект $ scope выполняет следующие задачи:
Передача данных из контроллера в представление
Передача поведения из контроллера в представление
Склеивает контроллер и вид вместе
Объект $ scope изменяется при изменении представления, а представление изменяется при изменении свойств объекта $ scope.
Мы прикрепляем свойства к объекту $ scope, чтобы передавать данные и поведение в представление. Прежде чем использовать объект $ scope в контроллере, нам нужно передать его функции контроллера в качестве зависимостей.
Использование синтаксиса «контроллер как» и vm
Мы можем переписать указанный выше контроллер, используя контроллер в качестве синтаксиса и переменную vm, как показано в листинге ниже:
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;
}
});
По сути, мы назначаем это переменной vm, а затем присоединяем к ней свойство и поведение. В представлении мы можем получить доступ к AddVmController, используя контроллер в качестве синтаксиса. Это показано в листинге ниже:
<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>
Конечно, мы можем использовать в контроллере в качестве синтаксиса другое имя, кроме «vm». Под капотом AngularJS создает объект $ scope и прикрепляет свойства и поведение. Однако при использовании контроллера в качестве синтаксиса код контроллера становится очень чистым, и в представлении отображается только псевдоним.
Вот несколько шагов по использованию контроллера в качестве синтаксиса:
Создайте контроллер без объекта $ scope.
Назначьте это локальной переменной. Я предпочел имя переменной как vm, вы можете выбрать любое имя по вашему выбору.
Присоедините данные и поведение к переменной vm.
В представлении дайте контроллеру псевдоним, используя контроллер в качестве синтаксиса.
Вы можете дать псевдониму любое имя. Я предпочитаю использовать vm, если я не работаю с вложенными контроллерами.
При создании контроллера нет прямых преимуществ или недостатков использования подхода $ scope object или контроллера в качестве синтаксиса. Однако это чисто вопрос выбора, однако использование контроллера в качестве синтаксиса делает код JavaScript контроллера более читабельным и предотвращает любые проблемы, связанные с этим контекстом.
Вложенные контроллеры в объектном подходе $ scope
У нас есть два контроллера, как показано в листинге ниже:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
Свойство age находится внутри обоих контроллеров, и в представлении эти два контроллера могут быть вложены, как показано в листинге ниже:
<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>
Как видите, для доступа к свойству age родительского контроллера мы используем $ parent.age. Разделение контекста здесь не очень четкое. Но используя контроллер в качестве синтаксиса, мы можем работать с вложенными контроллерами более элегантно. Допустим, у нас есть контроллеры, как показано в листинге ниже:
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";
});
На представлении эти два контроллера могут быть вложены, как показано в листинге ниже:
<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>
В контроллере как синтаксис у нас есть более читаемый код, и к родительскому свойству можно получить доступ, используя псевдоним родительского контроллера вместо использования синтаксиса $ parent.
Я завершу этот пост, сказав, что это исключительно ваш выбор, хотите ли вы использовать контроллер как синтаксис или объект $ scope. У них нет огромных преимуществ или недостатков, просто контроллер как синтаксис, который вы контролируете в контексте, немного проще в работе, учитывая четкое разделение вложенных контроллеров в представлении.