обнаруживайте изменения в угловых формах с помощью стратегии ChangeDetectionStrategy.Онпуш

#angular #forms

Вопрос:

Поэтому мне нужно обнаружить изменение статуса формы во время использования ChangeDetectionStrategy.OnPush . таким образом, проблема заключается в следующем: если я добавляю новый ввод в форму, и он пуст, и я удаляю его после формы.состояние по-прежнему показывает, что форма недействительна, даже если я удалил пустой ввод. И из-за этого кнопка сохранения по-прежнему отключена. Но когда я нажимаю любую другую форму ввода, статус меняется .

Я знаю, что это потому, что я изменил стратегию поиска.OnPush
, когда он установлен по умолчанию, он работает без проблем, Поэтому есть ли какой-либо другой способ исправить это, кроме как оставить измененное определение в настройках по умолчанию?

Ответ №1:

вы можете импортировать ChangeDetectorRef в конструктор, например, следующее

  constructor(private ref: ChangeDetectorRef) {
  }
 

и не забудьте импортировать его вот так :

 import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';
 

и после этого вы можете использовать метод detectChanges , с помощью которого вы запускаете проверку состояния формы, как показано ниже :

  this.ref.detectChanges();
 

Ответ №2:

при использовании changeDetectionStrategy.onPush стратегии вы сказали angular прекратить выполнение цикла обнаружения изменений по умолчанию. поэтому после внесения изменений вы должны заставить angular запустить цикл обнаружения изменений.

@Component({…, changeDetection: Стратегия изменений.Онпуш })

у вас есть 2 способа сделать это. сначала импортируйте и объявите ChangeDetectorRef

 import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';


constructor(private cd: ChangeDetectorRef) {}
 
  1. повторите или продолжите цикл обнаружения угловых изменений в обычном режиме. это позволит проверить все изменения в дереве DOM компонентов.
    this.cd.reattach();
  2. Цикл обнаружения изменений срабатывания вручную зависит от вашего желания. он проверит, что даже ни один объект не изменился. this.cd.detectChanges();