Как обнаружить изменение в функции ввода углового сигнала?

У меня есть компонент, который принимает два входа: user и userList. Интересно, следует ли мне обнаружить изменение с помощью крючка жизненного цикла ngOnChanges? Какова наилучшая практика для этого?

  // Note: Old approach
  // @Input() user: User; // For editing a user
  // @Input({ alias: "userList" }) _userList: User[] = [];
  // @Output() addUser = new EventEmitter<User>();

  // Note: New approach
  user = input<User>();
  _userList = input<User[]>([], { alias: "userList" });
  addUser = output<User>();

  constructor(private userService: UserService) { }

  ngOnInit(): void {
    this.getRoleList();
  }

  ngOnChanges(changes: SimpleChanges): void {
    const { user, _userList } = changes;
    console.info(changes);

    if (user && user.currentValue) {
      this.userModel = user.currentValue;
      this.initializeForm(user.currentValue);
    }

    if (_userList) {
      this.userList.set(_userList.currentValue);
    }
  }

Я попробовал перехват жизненного цикла ngOnChanges, и он работает нормально, но я не знаю, подходит ли он для моего компонента, основанного на сигналах, или нет.

input() возвращает сигнал. Вы можете использовать этот сигнал для отслеживания обновлений.

user680786 12.04.2024 12:49
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
1
1 715
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для обнаружения изменений сигнала вы можете использовать effect().

https://angular.io/guide/signals#effects

Вот пример:

https://stackblitz.com/edit/angular-yxrzwb

Ответ принят как подходящий

Новые входные сигналы, определяемые возвращаемыми сигналами signal() или signal.required().

Как и любой другой сигнал, вы можете использовать effect() для отслеживания и подписки на изменения, которые могут произойти.

effect(() => {
  console.info(this.user);
  // will be call when `this.user` changes
})

Существует также еще одна альтернатива, основанная на RxJS. Angular предоставляет взаимодействие для преобразования сигналов в наблюдаемые с помощью функции toObservable().

toObservable(this.user).subscribe((newUser) => /* when user changes */);

Привет, Матье. Как я могу присвоить новое значение моей сигнальной переменной, когда мой входной сигнал изменится? Я знаю, что мы не можем использовать эффект

Sepehr-Aghdasi 16.04.2024 16:45

Вероятно, вам придется использовать эффект и включить запись сигнала.

Matthieu Riegler 16.04.2024 23:32

«Избегайте использования эффектов для распространения изменений состояния», — говорится в документации Angular. Вы можете прочитать примеры использования метода effect() и многое другое здесь

Computed() идеально подходит для отслеживания изменений. Вот простой пример:

ТС:

someDataToKeepTrack = input.required<number>();

//Whenever someDataToKeepTrack  field updates, someRelatedData will be re-computed
someRelatedData = computed( () => {
    console.info('Data has changed. Here is the new value : ' + this.someDataToKeepTrack() )
    return this.someDataToKeepTrack() * 2;
  } );

HTML:

<p> Here is updated-data: {{someRelatedData() }} </p>

Где мы называем компонент — HTML:

<some-component [someDataToKeepTrack] = "inputData"></some-component>  

<input type = "text" name = "inputData" [(ngModel)] = "inputData" />

Где мы называем компонент — TS:

inputData = 10; //Initial Data

Другие вопросы по теме