Ciri dalam Angular.js, pengikatan dua hala.
Apakah fungsi ajaib yang membolehkan perubahan dalam paparan dicerminkan secara langsung dalam data Perubahan dalam data dimaklumkan kepada paparan dalam masa nyata.
Ini adalah terima kasih kepada 3 kaedah skop penting berikut:
$watch
$digest
$apply
Apakah perbezaan mereka? Mari perkenalkan mereka:
$watch
Ini ialah pendengar yang mendengar data pada skop
Penerangan kaedah:
$scope.$watch('参数',function(newValue,oldValue){ //逻辑处理 })
Kami mencipta pendengar di atas.
'Parameter' ialah objek (atau atribut objek) di bawah objek $scope. Ambil perhatian bahawa ini dalam bentuk rentetan
$scope.$watch('name',function(newValue,oldValue){ //逻辑处理 })
Parameter diikuti dengan fungsi panggil balik Parameter fungsi panggil balik mengembalikan atribut yang dipantau, nilai baharu selepas perubahan dan nilai lama sebelum perubahan sebelumnya.
$digest
$mohon
$apply adalah bersamaan dengan menyemak semua data dalam rootScope, ia akan menyemak semua data daripada ibu bapa kepada anak
Kaedah $apply() mempunyai dua bentuk.
Ini mencetuskan fungsi $digest dan melaksanakan fungsi
dalam parameter sekali
Ini hanya mencetuskan kitaran $digest ibu bapa kepada anak
Saya tidak menetapkan monitor, kenapa paparan dan data boleh terikat dalam dua arah
Contohnya, kotak teks ng-model="name"
Pada masa ini, sebenarnya terdapat nama atribut di bawah objek $scope untuk sepadan dengan pengikatan dua hala dengan paparan di atas
Malah, apabila kita mentakrifkan ng-model="name" atau ng-bind="name" atau {{name}}
Pada masa ini, angular.js secara automatik akan menetapkan pendengar untuk atribut "nama" pada model $scope:
$scope.$watch('name', function(newValue, oldValue) { //监听 name 属性的变化 });
Sudah tentu, kadangkala anda akan mendapati bahawa data telah berubah Tetapi UI tidak dimuatkan semula Adakah pengikatan dua hala tidak sah?
Tidak
Cuma apabila model $scope melintasi gelung digest, data anda belum dikembalikan lagi,
Sebagai contoh, apabila memanggil kaedah secara tidak segerak, data dikembalikan oleh callbac
Sebagai contoh, anda menetapkan fungsi pencetus yang dijadualkan dalam setTimeout, dan kemudian mengubah suai data model
Ringkasnya, kitaran ringkasan model $scope telah terlepas, menyebabkan model tidak memberitahu UI untuk memuat semula mengikut data baharu.
Apakah yang perlu saya lakukan jika saya menghadapi masalah sedemikian?
Kami perlu memanggil ringkasan secara manual untuk menyemak data dalam satu gelung untuk mencapai pengikatan dua hala
Seperti yang telah kami katakan di atas, biasanya tidak memanggil kaedah digest secara langsung, tetapi secara manual memanggil kaedah $apply untuk secara tidak langsung mencetuskan gelung $digest.
Seperti berikut:
setTimeout(function() { $scope.name= '一介布衣'; $scope.$apply(); }, 2000);
Setakat ini, angular.js telah melaksanakan kaedah $apply() secara automatik untuk beberapa arahan dan perkhidmatan.
Contohnya, ng-click, ng-model, perkhidmatan $timeout, perkhidmatan $http, dsb.
Selepas memanggil, angular.js akan memanggil $apply() secara automatik untuk kami mencapai pengikatan data dua hala.