TypeScript - מהי הדרך הנכונה להשתמש ב-changeDetection.markForCheck() ב-Angular?
אני משתמש ב-markForCheck כדי לזהות שינויים ברכיב האנגולר שלי (שיש לו changeDetection: ChangeDetectionStrategy.OnPush) ובתחילה, שמתי את ה-markForCheck בתחילת הפונקציה וזה עבד עבורי ואז הבנתי שיהיה יותר הגיוני לשים זאת אחרי שכל פעולת הפונקציה הסתיימה.
בשני המקרים, Angular זיהה את השינויים אם הוא נקרא בתחילה או לאחר שהפעולה הושלמה.
אז אם מישהו יכול להצדיק מה יהיה הדרך הנכונה להשתמש ב-markForCheck?
functionName() { // It works at both places
this.cd.markForCheck();
//
.... Some Code that needs markForCheck ....
//
this.cd.markForCheck();
}
תשובה #1
אתה צריך להשתמש ב-this.cdr.markForCheck() לאחר ששינית כמה נתונים והרכיב מכיל את הנכס changeDetection: ChangeDetectionStrategy.OnPush
בגלל שבמקרה זה הרכיב לא יטען מחדש את תבנית ה-HTML שלו אם לחלק מהתת-רכיבים יש OnPush - ההורה עם "markForCheck()" גם יצייר אותם מחדש. אם הנתונים משתנים בתצוגה בתת-רכיב ללא OnPush, אפשר לא להשתמש ב-"markForCheck()"
במקרה שלי ל-compA יש mat-table ב-HTML, אז אחרי רענון פריטים אני קורא ל-markForCheck() לצורך שידור מחדש של ה-mat-table
תשובה #2
אתה משתמש ב-markForCheck() כדי להגיד ל-Angular 'לסמן' שינויים שהתרחשו מחוץ לאסטרטגיית זיהוי השינויים הפעילה.
כאשר אתה משתמש באסטרטגיית זיהוי שינויים ברירת המחדל, markForCheck() אינו נחוץ והניחוש שלי הוא שזה הסיבה לכך שלא היה משנה היכן במקור קראת ל-markForCheck().
המקום הנכון לקרוא ל-markForCheck() הוא בתוך קומפוננטה עם ChangeDetectionStrategy.OnPush לאחר שעשית שינויים שלא יתפסו על ידי זיהוי השינויים של OnPush.
הנה הסבר מעמיק יותר שאולי תמצא מועיל, מה ההבדל בין markForCheck() ל-detectChanges()
עריכה: בטעות אמרתי ש-markForCheck() מפעיל את זיהוי השינויים וזה לא נכון. תודה ל-@Fatih Ersoy