Angular2. Как отловить изменения в объекте?

Имеется объект:
var a = {foo: 1};

и где-то его изменили на:
a.foo = 'new value';

Как узнать, что объект был изменён (желательно коллбеком)?

В ангуляре для этих целей есть RxJs со своим Observable, но я не монимаю как его применить для определения изменений в объекте.

В просторах нашёл вот такое решение:
stackoverflow.com/questions/32683488/rxjs-observin...

но самое смешное, что в ангуляре нет
Rx.Observable
.ofObjectChanges


а есть
Rx.Observable
.of


который не реагирует на изменения.
Как решить?
  • Вопрос задан
  • 2504 просмотра
Решения вопроса 1
AMar4enko
@AMar4enko
Rx.Observable.of(value)
создает поток, который содержит одно событие с value. Это совсем не про изменения.
От шаблона, который вы хотите применить, в Angular2 уходят, в сторону реактивности.

У компонентов в Angular2 есть input-свойства, изменения которых можно отслеживать с помощью life-cycle callback, конкретно интерфейс OnChanges. Выглядеть будет примерно так:
@Component({selector: 'my-component', template: '<span>{{text}}</span>'}}
class MyComponent implements OnChanges {
  public text: string;
  @Input() changeMe: string;
  
  ngOnChanges(changes) {
    this.text = Date.now().toString();
  }
}


Предположим, что в компоненте верхнего уровня у вас есть:
<my-component [changeMe]="someValue"></my-component>


Изменяя someValue вы изменяете input-атрибут changeMe компонента MyComponent. При каждом изменении будет срабатывать ngOnChanges.
Еще одно замечание - если в качестве значения вы передаете объект, то не надо его мутировать. Создавайте новый объект и присваивайте заново.
this.someValue = {value: 1, anotherValue: 2};
this.someValue = Object.assign({}, this.someValue, {value: 2}); // {value: 2, anotherValue: 2} // Но тут this.someValue это ссылка уже на другой объект.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы