Angular 6: как отслеживать изменения переменной в компоненте?

  1. Внутри компонента страницы есть массив;
  2. В нескольких разных местах внутри компонента к этому массиву добавляется новый элемент (в методе createMessage () и внутри подписчика getIncomingMessagesStream ());
  3. Каждый раз, когда в массив добавляется новый элемент, мне нужно выполнить сразу несколько действий (прокрутить страницу вниз и еще некоторых действий);
  4. Вместо того, чтобы выполнять дополнительные действия в нескольких местах, я хочу сделать это в одной точке внутри компонента, когда в мой массив добавляется новое значение.

Как это сделать?

В Angular 1.x был метод $ watch (), но его нет в Angular 2+.

I push a new message to messages array in several places:
- this.messageService.getIncomingMessagesStream().subscribe(...there...)
- createMessage() {...there...}

After I push a new message I need to do the same several actions:
- scroll window to bottom 
- etc...

Now I have to copy-paste the same actions in every place where I push a new message in messages array.

But I don't want to copy-paste this actions,
I want to perform them after I push a new element to messages array,
perform then automatically, from one point in code, without copy-paste,
I don't want to duplicate this actions.

почему бы не добавить прослушиватель onChange к массиву в основном компоненте подписки: Здесь angular.io/api/core/OnChanges, это если объект привязан к данным.

Remario 18.06.2018 21:01

Насколько я знаю, ngOnChanges () обнаруживает только свойства, которые получают значения от внешнего компонента через декоратор @Input (). Но мне нужно определить внутренние свойства компонента; значения для этого свойства не поступают извне.

ame 18.06.2018 21:18

Как вы добавляете новые значения в массив?

ConnorsFan 18.06.2018 22:43

myArray.push (новыйEl); но я помещаю новый элемент в два места в моем компоненте.

ame 18.06.2018 23:05

Могли бы вы написать такой метод, как private pushValue(value) { this.myArray.push(value); doSomethingElse(); }, и всегда использовать этот метод для добавления значения?

ConnorsFan 18.06.2018 23:11

Также: используете ли вы значения массива в цикле *ngFor в шаблоне? Если да, можете ли вы показать эту разметку в вопросе?

ConnorsFan 18.06.2018 23:15
Тестирование функциональных 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
6
2 327
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Думаю, я нашел решение. Это объект ES6 Прокси.

Прокси - это специальный объект, предназначенный для перехвата обращений к другому объекту и, при необходимости, их модификации и выполнения дополнительных действий.

let my_arr = [];
// Proxy(target, handler)
let arr_proxy = new Proxy(my_arr, {
    get(target, prop) {
        console.info(`\n Getting ${prop}`);
    console.info(`Perform needed actions after getting ${prop}`);
        return target[prop];
    },

    set(target, prop, value) {
        console.info(`\n Setting ${prop} ${value}`);
    console.info(`Perform needed actions after setting ${prop} ${value}`);
        target[prop] = value;
        return true;
    }
});

arr_proxy.push('new message text');

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Также я нашел решение с использованием BehaviorSubject из RxJS.

// page.component.ts

private appData = new BehaviorSubject<any[]>([]);

constructor() {
    this.appData.subscribe((data) => {
        console.info('New data', data);
    });
}

public addSomethingToAppData(something) {
    this.appData.next([...this.appData.getValue(), something]);
}

http://reactivex.io/rxjs/manual/overview.html#behaviorsubject

Как вы думаете, что лучше использовать, ES6 Proxy или RxJS BehaviorSubject, для выполнения некоторых действий после того, как новый элемент был помещен в массив?

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