AngularJS ขยายนี้เหตุการณ์วง , AngularJS context
การสร้างสิ่งที่เรียกว่า
$ นาฬิกา ()
ทุกครั้งที่คุณผูกบางสิ่งบางอย่างใน UI คุณใส่$watch
ใน$watch
รายการ
User: <input type="text" ng-model="user" />
Password: <input type="password" ng-model="pass" />
ที่นี่เรามี$scope.user
ซึ่งถูกผูกไว้กับอินพุตแรกและเรามี$scope.pass
ซึ่งถูกผูกไว้กับที่สอง การทำเช่นนี้เราเพิ่มสอง$watch
ES ไปยัง$watch
รายการ
เมื่อโหลดเทมเพลตของเราAKA ในขั้นตอนการเชื่อมโยงคอมไพเลอร์จะมองหาทุกคำสั่งและสร้าง$watch
es ทั้งหมดที่จำเป็น
AngularJS ให้$watch
, และ$watchcollection
$watch(true)
ด้านล่างเป็นแผนภาพเรียบร้อยอธิบายทั้งสามนำมาจากนักดูในเชิงลึก
angular.module('MY_APP', []).controller('MyCtrl', MyCtrl)
function MyCtrl($scope,$timeout) {
$scope.users = [{"name": "vinoth"},{"name":"yusuf"},{"name":"rajini"}];
$scope.$watch("users", function() {
console.log("**** reference checkers $watch ****")
});
$scope.$watchCollection("users", function() {
console.log("**** Collection checkers $watchCollection ****")
});
$scope.$watch("users", function() {
console.log("**** equality checkers with $watch(true) ****")
}, true);
$timeout(function(){
console.log("Triggers All ")
$scope.users = [];
$scope.$digest();
console.log("Triggers $watchCollection and $watch(true)")
$scope.users.push({ name: 'Thalaivar'});
$scope.$digest();
console.log("Triggers $watch(true)")
$scope.users[0].name = 'Superstar';
$scope.$digest();
});
}
http://jsfiddle.net/2Lyn0Lkb/
$digest
ห่วง
เมื่อเบราว์เซอร์ได้รับเหตุการณ์ที่สามารถจัดการโดยบริบท AngularJS $digest
ลูปจะเริ่มทำงาน ห่วงนี้ทำจากสองวงเล็ก ๆ หนึ่งในการประมวลผล$evalAsync
คิวและอื่น ๆ $watch list
หนึ่งกระบวนการ $digest
ประสงค์ห่วงผ่านรายการของ$watch
ที่เรามี
app.controller('MainCtrl', function() {
$scope.name = "vinoth";
$scope.changeFoo = function() {
$scope.name = "Thalaivar";
}
});
{{ name }}
<button ng-click="changeFoo()">Change the name</button>
ที่นี่เรามีเพียงอันเดียว$watch
เนื่องจาก ng-click ไม่ได้สร้างนาฬิกาใด ๆ
เรากดปุ่ม
- เบราว์เซอร์ได้รับเหตุการณ์ซึ่งจะเข้าสู่บริบท AngularJS
- การ
$digest
วนซ้ำจะทำงานและจะขอให้ทุก ๆ คอยดูการเปลี่ยนแปลง
- เนื่องจากสิ่ง
$watch
ที่เฝ้าดูการเปลี่ยนแปลงใน $ scope.name รายงานการเปลี่ยนแปลงจึงจะบังคับให้$digest
วนซ้ำอีกครั้ง
- วนซ้ำใหม่ไม่มีอะไรรายงาน
- เบราว์เซอร์ได้รับการควบคุมกลับมาและมันจะอัพเดท DOM ที่สะท้อนถึงค่าใหม่ของ $ scope.name
- สิ่งสำคัญที่นี่คือว่าทุกเหตุการณ์ที่เข้าสู่บริบท AngularJS จะเรียกใช้
$digest
วนซ้ำ นั่นหมายความว่าทุกครั้งที่เราเขียนจดหมายในอินพุตลูปจะทำการตรวจสอบทุกรายการ$watch
ในหน้านี้
$ ใช้ ()
หากคุณโทร$apply
เมื่อมีเหตุการณ์เกิดขึ้นเหตุการณ์นั้นจะเข้าสู่บริบทเชิงมุม แต่ถ้าคุณไม่เรียกมันเหตุการณ์นั้นจะวิ่งออกไปข้างนอก มันง่ายอย่างที่คิด $apply
จะเรียก$digest()
ลูปภายในและจะวนซ้ำนาฬิกาทั้งหมดเพื่อให้แน่ใจว่า DOM ได้รับการอัปเดตด้วยค่าที่อัพเดตใหม่
$apply()
วิธีการจะเรียกดูบนทั้ง$scope
ห่วงโซ่ในขณะที่$digest()
วิธีการเดียวที่จะเรียกดูในปัจจุบันและ$scope
เมื่อไม่มีการสูงขึ้นวัตถุต้องรู้เกี่ยวกับการเปลี่ยนแปลงท้องถิ่นคุณสามารถใช้children
$scope
$digest()