Bab 5 $watch, $digest dan $apply
Sudah kita pelajari bersama pada bab – bab awal bahwa ketika ada perubahan nilai pada view maka perubahan juga akan terjadi pada scope yang ada di controller dan begitu juga sebaliknya ketika nilai scope di controller berubah maka perubahan pada view pun akan terjadi juga.
Kemampuan Angular untuk melakukan hal – hal tersebut berhubungan dengan method – method yang dimiliknya yaitu $watch
, $digest
dan $apply
. Secara umum, $watch
dan $digest
akan dijalankan secara automatis oleh Angular untuk memperbaharui nilai tetapi ada kondisi dimana kita harus menggunakannya secara manual untuk mengupdate nilai.
5.1 $watch
$watch
berfungsi untuk mengawasi perubahan nilai yang terjadi pada sebuah variabel di scope. Parameter pertama dari method ini adalah string dari nama variabel yang akan diawasi kemudian parameter kedua adalah berupa fungsi yang akan dijalankan (listener) ketika nilai yang diawasi berubah.
Saya sertakan potongan kode contoh di bawah ini untuk memahami cara kerja $watch
.
<body ng-app='AngularWatchApp' ng-controller='MainController'>
<input type='text' ng-model='book'/>
<div>
{{book}}
</div>
<div>
Book has been changed {{count}} times.
</div>
<!-- include .js here -–!>
</body>
Halaman di atas akan memunculkan teks masukan yang nilainya langsung dimunculkan di bawahnya. Kita akan memunculkan angka berapa kali nilai sudah diubah dengan menggunakan $watch
. Pada controller berikut adalah kodenya.
app.controller('MainController', function($scope){
$scope.book = 'Zero to One';
$scope.count = 0;
$scope.$watch('book', function(newValue, oldValue){
$scope.count = $scope.count + 1;
})
});
Coba jalankan dan ubah nilai yang ada pada teks masukan maka setiap perubahan yang terjadi akan membuat nilai dari counter bertambah.
5.2 $digest
Method ini bekerja dengan cara berkeliling ke semua watch yang ada. Ketika berkeliling nyamperin tiap watch, dia ngecek apakah nilai yang diawasi si watch ini berubah atau tidak, jika berubah maka dia manggil fungsi yang jadi parameter kedua dari si watch (fungsi listener).
Ada suatu kasus dimana kita harus memanggil $digest
supaya nilai dari variabel bisa terupdate. Pada kasus tertentu saat melakukan proses data binding ada data terbaru yang tidak terupdate maka kondisi seperti ini biasanya karena $digest
tidak jalan secara automatis dan kita harus menjalankannya secara manual.
link : function(scope,elem,attrs){
elem.bind('click',function(){
scope.dunia='Saya diklik';
scope.$digest();
});
}
Contoh kode di atas saya ambil dari kode saat kita belajar bersama materi directive. Coba jalankan kode yang ada pada materi tersebut tetapi dengan menghilangkan baris scope.$digest()
maka variabel dunia
yang berisi saya diklik
tidak akan muncul di-view. Hal ini terjadi karena $digest
tidak jalan karena kode ini berada diluar jangkauan langsung dari $scope
yang ada di controller.
5.3 $apply
Kalau saya bilang method ini merupakan penyederhanaan dari penggunaan $digest
. $apply
menjalankan fungsi yang menjadi parameternya kemudian secara automatis dia akan menjalankan $digest
. Dengan pengertian ini maka kode sebelumnya bisa diubah menjadi seperti ini.
link : function(scope,elem,attrs){
elem.bind('click',function(){
scope.$apply(function(){
scope.dunia='Saya diklik';
});
});
}