Во время углового жизненного цикла все компоненты подвержены невероятной системе обнаружения изменений Angular. Каждый раз, когда что -то меняется в вашем приложении, Angular обеспечивает обнаружение изменений (что чрезвычайно эффективно выполняет все обстоятельства), но этот процесс может стать узким местом в сложных веб -приложениях. Не бойся! Существует способ обойти нормальное обнаружение изменений, где Angular будет рассмотреть каждый элемент в его достижении, потенциально увязывая ваше веб -приложение.
В вашем компоненте декоратор:
@Component({
selector: 'app-my-component',
templateUrl: './my-component.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class MyComponentComponent {
Обновляя стратегию обнаружения изменений, вы эффективно сказали Angular, что вы не хотите, чтобы внешние изменения в очереди в вашем компоненте, чтобы Angular посмотрел на него.
Например, давайте предположим, что вы делали знаменитое приложение Todo List.
@Component({
selector: 'app-todo-list',
templateUrl: './todo-list.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TodoListComponent {
todos = ['Read Drew's post.', 'Review the post'];
addTodo(todo) {
this.todos.push(todo);
}
}
/** and this is your template (todo-list.component.html) **/
- {{ todo }}
С обнаружением изменения по умолчанию (mediceetectionstrategy.default) вы ожидаете добавления TODO для обновления списка.
Однако то, что происходит выше в нашем сценарии, где мы использовали Onpush Для нашей стратегии обнаружения изменений? Вы можете быть удивлены, узнав, что он не обновляет список в нашем DOM, хотя мы могли бы Console.log (todos) И посмотрите, что это определенно добавило наш новый Todo в этот список.
Исправление? Rxjs. Нам нужно показать новую ссылку на новый массив в этом списке в DOM, чтобы он изменил представление. Как это:
@Component({
selector: 'app-todo-list',
templateUrl: './todo-list.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TodoListComponent {
private todos = ['Read Drew's post.', 'Review the post'];
todos$ = new BehaviorSubject(todos);
addTodo(todo) {
this.todos.push(todo);
this.todos$.next(this.todos);
}
}
/** and this is your template (todo-list.component.html) **/
- {{ todo }}
Что произойдет, если вы просто не можете получить что -то, чтобы обновить все еще? Angular позволяет нам возможность явно обновить: Angular явно, когда обновлять:
@Component({
selector: 'app-todo-list',
templateUrl: './todo-list.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TodoListComponent {
private todos = ['Read Drew's post.', 'Review the post'];
constructor(private cd: ChangeDetectorRef) {}
addTodo(todo) {
this.todos.push(todo);
this.cd.detechChanges();
}
}
По сути, это сделало бы то же самое, что и наш первый пример. Хотя это все еще заставляет угловой пробежать обнаружение изменений, что просто делает то же самое, что мы пытались избежать, используя Onpush Стратегия обнаружения изменений в первую очередь. Итак, используйте его только тогда, когда это абсолютно необходимо.
Оригинал: “https://dev.to/drewpayment/angular-s-change-detection-58ip”