Рубрики
Без рубрики

Обнаружение изменений Angular

Во время углового жизненного цикла все компоненты подвержены невероятному обнаружению изменений Angular … Tagged с помощью угловой, JavaScript.

Во время углового жизненного цикла все компоненты подвержены невероятной системе обнаружения изменений 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”