מנגון Change Detection של אנגולר

 


כמתכנת אנגולר אני מאמין שלא פעם יצא לך לחשוב איך אנגולר מזהה שינויים בנתונים מרנדר מחדש את ה- view.

זה נקרא Change Detection Strategy. במדריך הזה נסקור את המנגנון הזה של אנגולר ונלמד איך להשתמש בו.

אז מה זה בעצם  Change Detection ?

הטכניקת של הזהוי שינויים בעצם משווה בין 2 סטייטים - הנוכחי והחדש אם יש שינוי ביניהם זה אומר שהדף צריך להתרנדר.

אז מה בעצם קורה ? המתכנת עשה שינוי בקומפוננטה ואנגולר מרנדר מחדש את העמוד.

נשמע דיי פשוט וטריוויאלי אבל מה שקורה מאחורי הקלעים זה שאנגולר מחפש את כל הקבצים, מבצע מחדש את כל הביטויים, משווה אותם לערכים הקודמים ומפיץ את השינוי לרכיבי ה-DOM אם מזוהה שינוי.

וככל שהאפליקציה שלנו גדלה אז בדיקה כזאת לוקחת יותר זמן.

 

אם נסתכל על עץ הקומפוננטות הבא:

Angular Component Tree 


 

ובכל פעם שהמתכנת יעשה שינוי בקומפוננטה ForgotPasswordComponent מנגנון change detection יופעל בצורה הבאה:

 

  1. המנגנון יעבור על כל קומפוננטה בעץ ויבדוק אם יש שינוי בה (הבדיקה מתחילה מלמעלה ללמטה)
  2. אם אנגולר ימצא שינוי באחת הקומפוננטות הוא יבצע את השיוני ויעשה רנדור מחדש.

לאנגולר יש 2 אסטרטגיות ל- change detection

Defualt:

זה בעצם מה שהסברתי בפסקה הקודם שכל שינוי גורר אחריו בדיקה של כל הקומפננטות מלמעלה למטה.

אז כבר הבנו שסוג כזה של התנהגות יכול להשפיע על כל הביצועים של המערכת שלנו.

OnPush:

אנחנו משנים את הסטרטגיית של Change Detection ע"י הוספת ChangeDetectionStrategy.OnPush ל- changeDetection ב- @Component.

 

 

עם ההסטרטגיית OnPush אנחנו בעצם מדלגים על קומפוננטות שממשות onPush ועל כל הילדים שלה.

 

Change Detection Strategy with OnPush

אנגולר יעדכן את הקומפוננטה רק במקרים הבאים:

  1. ה- @Input ישתנה רק במקרה שיש הפניה חדשה
  2. קרה event בקומפוממטה או באחד מהילדים שלה
  3. אם async pipe מקבל ערך חדש
  4. הפעלה מנגנון הזיהוי באופן ידני

 

נרחיב על כל אחד מהמקרים:

@input

אנגולר יריץ change detector במקרה של שינוי בהפניה. ז"א אם נרצה להעביר אובייקט נצטרך לשנות אותו ע"י יצירת אובייקט חדש.

Event Handler

כל אירוע שקורה בקומפוננטה או בילדים של הקומפוננטה יפעיל את כל עץ הקומפוננטות של האפליקציה.

אירועים שלא יופעלו כאשר נשתמש ב onPush:

* promise

* setTimout

* setInterval

* RxJS observable subscription

Async Pipe

אנגולר מריץ אוטומטית את markForCheck בכל פעם שאנחנו מפעילים את ה- aync pipe 

הפעלת מנגנון הזיהוי באופן ידני:

אז אנחנו יכולים לפהעיל את זה ע"י שימוש:

 

לסיכום

אנגולר Change Detection הוא מנגנון מאוד חשוב.

הוא מספק לנו ביצועים טובים יותר לאפליקציה שלנו בגלל שאנגולר לא צריך לבדוק בכל שינוי את כל הקומפוננטות