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