Sumber
Perbedaan antara Membuat pengontrol menggunakan $scope object
dan Menggunakan “controller as”
sintaks dan vm
Membuat pengontrol menggunakan objek $ scope
Biasanya kita membuat pengontrol menggunakan objek $ scope seperti yang ditunjukkan pada daftar di bawah ini:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
Di atas kita membuat AddController dengan tiga variabel dan satu perilaku, menggunakan pengontrol dan tampilan objek $ scope, yang berbicara satu sama lain. Objek $ scope digunakan untuk meneruskan data dan perilaku ke tampilan. Ini merekatkan tampilan dan pengontrol bersama.
Pada dasarnya objek $ scope melakukan tugas-tugas berikut:
Meneruskan data dari pengontrol ke tampilan
Meneruskan perilaku dari pengontrol ke tampilan
Rekatkan pengontrol dan tampilan bersama
Objek $ scope diubah saat tampilan berubah dan tampilan diubah ketika properti dari objek $ scope berubah
Kami melampirkan properti ke objek $ scope untuk meneruskan data dan perilaku ke tampilan. Sebelum menggunakan objek $ scope di controller, kita perlu meneruskannya ke fungsi controller sebagai dependensi.
Menggunakan sintaks "controller as" dan vm
Kita dapat menulis ulang pengontrol di atas menggunakan pengontrol sebagai sintaks dan variabel vm seperti yang ditunjukkan pada daftar di bawah ini:
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;
}
});
Pada dasarnya kami menetapkan ini ke variabel vm dan kemudian melampirkan properti dan perilaku ke sana. Pada tampilan kita dapat mengakses AddVmController menggunakan pengontrol sebagai sintaks. Ini ditunjukkan dalam daftar di bawah ini:
<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>
Tentu saja kita bisa menggunakan nama lain selain "vm" di controller sebagai sintaks. Di bawah tenda, AngularJS membuat objek $ scope dan melampirkan properti dan perilaku. Namun dengan menggunakan pengontrol sebagai sintaks, kode di pengontrol sangat bersih dan hanya nama alias yang terlihat di tampilan.
Berikut beberapa langkah untuk menggunakan pengontrol sebagai sintaks:
Buat pengontrol tanpa objek $ scope.
Tetapkan ini ke variabel lokal. Saya lebih suka nama variabel sebagai vm, Anda dapat memilih nama pilihan Anda.
Lampirkan data dan perilaku ke variabel vm.
Pada tampilan, berikan alias ke pengontrol menggunakan pengontrol sebagai sintaks.
Anda dapat memberikan nama apa pun ke alias. Saya lebih suka menggunakan vm kecuali saya tidak bekerja dengan pengontrol bersarang.
Dalam membuat pengontrol, tidak ada keuntungan atau kerugian langsung menggunakan pendekatan objek $ scope atau pengontrol sebagai sintaks. Ini murni masalah pilihan, namun, menggunakan pengontrol sebagai sintaks membuat kode JavaScript pengontrol lebih mudah dibaca dan mencegah masalah apa pun yang terkait dengan konteks ini.
Kontroler bersarang dalam pendekatan objek $ scope
Kami memiliki dua pengontrol seperti yang ditunjukkan pada daftar di bawah ini:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
Properti "age" ada di dalam kedua pengontrol, dan pada tampilan kedua pengontrol ini bisa disarangkan seperti yang ditunjukkan dalam daftar di bawah ini:
<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>
Seperti yang Anda lihat, untuk mengakses properti age dari kontroler induk kita menggunakan $ parent.age. Pemisahan konteks tidak terlalu jelas di sini. Tetapi menggunakan pengontrol sebagai sintaks, kita dapat bekerja dengan pengontrol bersarang dengan cara yang lebih elegan. Katakanlah kita memiliki pengontrol seperti yang ditunjukkan pada daftar di bawah ini:
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";
});
Pada tampilan, kedua pengontrol ini dapat disarangkan seperti yang ditunjukkan pada daftar di bawah ini:
<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>
Dalam pengontrol sebagai sintaks, kami memiliki kode yang lebih mudah dibaca dan properti induk dapat diakses menggunakan nama alias dari pengontrol induk daripada menggunakan sintaks $ induk.
Saya akan menyimpulkan posting ini dengan mengatakan bahwa itu murni pilihan Anda apakah Anda ingin menggunakan controller sebagai sintaks atau objek $ scope. Tidak ada keuntungan atau kerugian yang besar untuk keduanya, hanya saja pengontrol sebagai sintaks yang Anda kontrol pada konteksnya sedikit lebih mudah untuk dikerjakan, mengingat pemisahan yang jelas dalam pengontrol bersarang pada tampilan.