โดยการตรวจสอบ$scope
วัตถุที่สกปรก
Angular รักษาความเรียบง่ายarray
ของนักดูใน$scope
วัตถุ หากคุณตรวจสอบใด ๆ$scope
คุณจะพบว่ามันมีที่เรียกว่าarray
$$watchers
ผู้เฝ้าดูแต่ละคนนั้นเป็นobject
สิ่งที่มีอยู่เหนือสิ่งอื่นใด
- นิพจน์ที่ผู้เฝ้าดูกำลังมอนิเตอร์ นี่อาจเป็น
attribute
ชื่อหรือสิ่งที่ซับซ้อนกว่านี้
- ค่าที่ทราบล่าสุดของการแสดงออก สามารถตรวจสอบกับค่าที่คำนวณได้ในปัจจุบันของการแสดงออก หากค่าต่างกันผู้เฝ้าสังเกตจะเรียกใช้ฟังก์ชันและทำเครื่องหมาย
$scope
ว่าสกปรก
- ฟังก์ชั่นที่จะใช้งานถ้าตัวเฝ้าดูสกปรก
วิธีกำหนดผู้ดู
มีหลายวิธีในการกำหนดผู้เฝ้าดูใน AngularJS
คุณอย่างชัดเจนสามารถบน$watch
attribute
$scope
$scope.$watch('person.username', validateUnique);
คุณสามารถวางการ{{}}
แก้ไขในแม่แบบของคุณ (ผู้เฝ้าดูจะถูกสร้างขึ้นสำหรับคุณในปัจจุบัน$scope
)
<p>username: {{person.username}}</p>
คุณสามารถขอคำสั่งเช่นng-model
กำหนดผู้เฝ้าดูคุณ
<input ng-model="person.username" />
$digest
วงจรตรวจสอบดูทั้งหมดกับค่าสุดท้ายของพวกเขา
เมื่อเราโต้ตอบกับ AngularJS ผ่านช่องทางปกติ (ng-model, ng-repeat และอื่น ๆ ) วงจรย่อยจะถูกเรียกใช้โดยคำสั่ง
แยกยวงจรคือการข้ามผ่านความลึกแรกของ$scope
และเด็กทั้งหมด สำหรับแต่ละรายการ$scope
object
เราวนซ้ำ$$watchers
array
และประเมินค่านิพจน์ทั้งหมด หากค่านิพจน์ใหม่นั้นแตกต่างจากค่าที่ทราบล่าสุดฟังก์ชันของผู้สังเกตการณ์จะถูกเรียกใช้ ฟังก์ชั่นนี้อาจคอมไพล์ซ้ำส่วนหนึ่งของ DOM, คำนวณค่าอีกครั้ง$scope
, เรียกAJAX
request
สิ่งที่คุณต้องการให้ทำ
ทุกขอบเขตถูกสำรวจและทุกการแสดงออกของนาฬิกาจะถูกประเมินและตรวจสอบกับค่าสุดท้าย
หากทริกเกอร์ตัว$scope
เตือนทำงานสัญญาณสกปรก
หากทริกเกอร์เฝ้าดูแอพจะรู้ว่ามีบางอย่างเปลี่ยนไปและ$scope
จะมีการทำเครื่องหมายว่าสกปรก
ฟังก์ชั่น Watcher สามารถเปลี่ยนคุณลักษณะอื่น ๆ บนหรือผู้ปกครอง$scope
$scope
หาก$watcher
มีการเรียกใช้ฟังก์ชันหนึ่งเราไม่สามารถรับประกันได้ว่าฟังก์ชันอื่น ๆ ของเรา$scope
ยังคงสะอาดอยู่ดังนั้นเราจึงดำเนินการรอบการย่อยทั้งหมดอีกครั้ง
นี่เป็นเพราะ AngularJS มีการเชื่อมโยงสองทางดังนั้นข้อมูลสามารถถูกส่งกลับไปที่$scope
ต้นไม้ เราอาจเปลี่ยนค่าที่สูงกว่า$scope
ที่ถูกย่อยแล้ว $rootScope
บางทีเราเปลี่ยนค่าใน
หาก$digest
สกปรกเราดำเนินการ$digest
รอบทั้งหมดอีกครั้ง
เราวนรอบอย่างต่อเนื่อง$digest
จนกว่าวงจรย่อยจะทำความสะอาด ( $watch
นิพจน์ทั้งหมดมีค่าเหมือนกันกับรอบก่อนหน้า) หรือถึงขีด จำกัด การแยกย่อย โดยค่าเริ่มต้นขีด จำกัด นี้ถูกตั้งไว้ที่ 10
หากเราถึงขีด จำกัด การแยกย่อย AngularJS จะทำให้เกิดข้อผิดพลาดในคอนโซล:
10 $digest() iterations reached. Aborting!
การแยกย่อยทำได้ยากบนเครื่อง แต่ง่ายสำหรับผู้พัฒนา
อย่างที่คุณเห็นทุกครั้งที่มีการเปลี่ยนแปลงในแอป AngularJS AngularJS จะตรวจสอบผู้เฝ้าดูทุกคนใน$scope
ลำดับชั้นเพื่อดูวิธีการตอบสนอง สำหรับนักพัฒนาซอฟต์แวร์นี่เป็นประโยชน์อย่างมากเนื่องจากคุณต้องเขียนรหัสการเดินสายเกือบไม่ได้เลย AngularJS จะสังเกตเห็นว่ามีการเปลี่ยนแปลงค่าและทำให้แอพที่เหลือสอดคล้องกับการเปลี่ยนแปลง
จากมุมมองของตัวเครื่องแม้ว่าจะไม่มีประสิทธิภาพมากและจะทำให้แอปของเราช้าลงหากเราสร้างนักดูมากเกินไป Misko ได้เสนอตัวเลขของนักดูประมาณ 4,000 คนก่อนที่แอปของคุณจะรู้สึกช้าในเบราว์เซอร์รุ่นเก่า
ขีด จำกัด นี้เข้าถึงได้ง่ายหากคุณng-repeat
มีขนาดใหญ่JSON
array
เกินไป คุณสามารถลดปัญหานี้ได้โดยใช้คุณสมบัติเช่นการเชื่อมโยงครั้งเดียวเพื่อรวบรวมแม่แบบโดยไม่ต้องสร้างนักดู
วิธีหลีกเลี่ยงการสร้างนักดูมากเกินไป
ทุกครั้งที่ผู้ใช้โต้ตอบกับแอพของคุณผู้ตรวจสอบแต่ละคนในแอปจะได้รับการประเมินอย่างน้อยหนึ่งครั้ง ส่วนใหญ่ของการเพิ่มประสิทธิภาพแอป AngularJS คือการลดจำนวนผู้ดูใน$scope
ต้นไม้ของคุณ วิธีง่ายๆในการทำเช่นนี้คือมีผลผูกพันครั้งเดียว
หากคุณมีข้อมูลที่จะไม่เปลี่ยนแปลงบ่อยครั้งคุณสามารถผูกมันได้เพียงครั้งเดียวโดยใช้ไวยากรณ์ :: เช่น:
<p>{{::person.username}}</p>
หรือ
<p ng-bind="::person.username"></p>
การผูกจะถูกทริกเกอร์เมื่อมีการแสดงเท็มเพลตที่มีอยู่และข้อมูลถูกโหลดเข้า$scope
มา
นี่เป็นสิ่งสำคัญอย่างยิ่งเมื่อคุณมีng-repeat
สิ่งของหลายอย่าง
<div ng-repeat="person in people track by username">
{{::person.username}}
</div>