Saya memiliki acara klik yang terjadi di luar lingkup direktif kustom saya, jadi alih-alih menggunakan atribut "ng-klik", saya menggunakan pendengar jQuery.click () dan memanggil fungsi di dalam lingkup saya seperti:
$('html').click(function(e) {
scope.close();
);
close () adalah fungsi sederhana yang terlihat seperti ini:
scope.close = function() {
scope.isOpen = false;
}
Dalam pandangan saya, saya memiliki elemen dengan "ng-show" terikat ke isOpen seperti ini:
<div ng-show="isOpen">My Div</div>
Ketika debugging, saya menemukan bahwa close () dipanggil, isOpen sedang diperbarui ke false, tetapi tampilan AngularJS tidak memperbarui. Apakah ada cara saya bisa secara manual memberi tahu Angular untuk memperbarui tampilan? Atau ada pendekatan yang lebih "sudut" untuk memecahkan masalah ini yang tidak saya lihat?
javascript
angularjs
Dustin
sumber
sumber
$scope.$apply();
?Kenapa
$apply
harus dipanggil?TL; DR :
$apply
harus dipanggil kapan pun Anda ingin menerapkan perubahan yang dibuat di luar dunia Angular.Sekadar memperbarui jawaban Dustin , berikut adalah penjelasan tentang apa sebenarnya yang diterapkan $ dan mengapa ia bekerja.
Angular memungkinkan nilai apa pun untuk digunakan sebagai target yang mengikat. Kemudian di akhir setiap pergantian kode JavaScript, ia memeriksa untuk melihat apakah nilainya telah berubah. Langkah itu yang memeriksa untuk melihat apakah ada nilai mengikat yang berubah sebenarnya memiliki metode,
$scope.$digest()
1 . Kami hampir tidak pernah memanggilnya secara langsung, karena kami menggunakan$scope.$apply()
(yang akan memanggil$scope.$digest
).Angular hanya memonitor variabel yang digunakan dalam ekspresi dan apapun yang ada di dalam
$watch
kehidupan di dalam ruang lingkup. Jadi jika Anda mengubah model di luar konteks Angular, Anda perlu meminta$scope.$apply()
agar perubahan tersebut disebarkan, jika tidak, Angular tidak akan tahu bahwa mereka telah diubah sehingga pengikatan tidak akan diperbarui 2 .sumber
Menggunakan
ingat untuk menyuntikkan
$route
ke controller Anda.sumber
$state.reload()