Anda harus sadar tentang cara kerja AngularJS untuk memahaminya.
Siklus pencernaan dan $ lingkup
Pertama dan terpenting, AngularJS mendefinisikan konsep siklus digest . Siklus ini dapat dianggap sebagai loop, di mana AngularJS memeriksa apakah ada perubahan pada semua variabel yang ditonton oleh semua $scope
s. Jadi, jika Anda telah $scope.myVar
menetapkan di controller Anda dan variabel ini ditandai untuk diawasi , maka Anda secara implisit memberitahu AngularJS untuk memantau perubahan pada myVar
setiap iterasi dari loop.
Pertanyaan tindak lanjut yang wajar adalah: Apakah segala sesuatu terkait dengan $scope
diawasi? Untungnya tidak. Jika Anda akan melihat perubahan pada setiap objek di Anda $scope
, maka dengan cepat loop intis akan membutuhkan waktu lama untuk mengevaluasi dan Anda akan dengan cepat mengalami masalah kinerja. Itulah sebabnya tim AngularJS memberi kami dua cara untuk menyatakan beberapa $scope
variabel sedang diawasi (baca di bawah).
$ watch membantu mendengarkan perubahan $ scope
Ada dua cara untuk mendeklarasikan $scope
variabel sebagai yang diawasi.
- Dengan menggunakannya di templat Anda melalui ekspresi
<span>{{myVar}}</span>
- Dengan menambahkannya secara manual melalui
$watch
layanan
Iklan 1) Ini adalah skenario yang paling umum dan saya yakin Anda pernah melihatnya sebelumnya, tetapi Anda tidak tahu bahwa ini telah membuat arloji di latar belakang. Ya, benar! Menggunakan arahan AngularJS (seperti ng-repeat
) juga dapat membuat jam tangan implisit.
Iklan 2) Ini adalah bagaimana Anda membuat jam tangan Anda sendiri . $watch
layanan membantu Anda untuk menjalankan beberapa kode ketika beberapa nilai yang melekat pada $scope
telah berubah. Ini jarang digunakan, tetapi kadang-kadang bermanfaat. Misalnya, jika Anda ingin menjalankan beberapa kode setiap kali 'myVar' berubah, Anda dapat melakukan hal berikut:
function MyController($scope) {
$scope.myVar = 1;
$scope.$watch('myVar', function() {
alert('hey, myVar has changed!');
});
$scope.buttonClicked = function() {
$scope.myVar = 2; // This will trigger $watch expression to kick in
};
}
$ apply memungkinkan untuk mengintegrasikan perubahan dengan siklus digest
Anda dapat menganggap $apply
fungsinya sebagai mekanisme integrasi . Anda lihat, setiap kali Anda mengubah beberapa variabel yang ditonton yang melekat pada$scope
objek secara langsung, AngularJS akan tahu bahwa perubahan telah terjadi. Ini karena AngularJS sudah tahu untuk memantau perubahan itu. Jadi jika itu terjadi dalam kode yang dikelola oleh kerangka kerja, siklus intisari akan melanjutkan.
Namun, terkadang Anda ingin mengubah beberapa nilai di luar dunia AngularJS dan melihat perubahannya menyebar secara normal. Pertimbangkan ini - Anda memiliki $scope.myVar
nilai yang akan dimodifikasi dalam $.ajax()
penangan jQuery . Ini akan terjadi di beberapa titik di masa depan. AngularJS tidak sabar menunggu hal ini terjadi, karena belum diinstruksikan untuk menunggu di jQuery.
Untuk mengatasinya, $apply
sudah diperkenalkan. Ini memungkinkan Anda memulai siklus pencernaan secara eksplisit. Namun, Anda hanya boleh menggunakan ini untuk memigrasi beberapa data ke AngularJS (integrasi dengan kerangka kerja lain), tetapi jangan pernah menggunakan metode ini dikombinasikan dengan kode AngularJS biasa, karena AngularJS akan membuang kesalahan saat itu.
Bagaimana semua ini terkait dengan DOM?
Nah, Anda harus benar-benar mengikuti tutorial lagi, sekarang setelah Anda tahu semua ini. Siklus intisari akan memastikan bahwa UI dan kode JavaScript tetap disinkronkan, dengan mengevaluasi setiap pengamat yang terpasang pada semua $scope
selama tidak ada perubahan. Jika tidak ada lagi perubahan yang terjadi di loop digest, maka itu dianggap selesai.
Anda bisa melampirkan objek ke $scope
objek baik secara eksplisit di Controller, atau dengan mendeklarasikannya dalam {{expression}}
bentuk langsung di tampilan.
Saya harap ini membantu menjelaskan beberapa pengetahuan dasar tentang semua ini.
Bacaan lebih lanjut: