Потому что вы подписываетесь на data$
каждый раз, когда нажимаете.Если вы хотите сделать это onClick
, возможно, отмените подписку после console.log(x)
или используйте rxjs take()
:
onClick() {
this.data$.pipe(take(1)).subscribe(x =>
console.log(x)
);
}
Из документов:
Зачем использовать take
Когда вас интересует только первый установленный номер эмиссии, вы хотите использовать дубль.Может быть, вы хотите увидеть, на что пользователь нажал в первый раз, когда он / она впервые зашел на страницу, вы хотите подписаться на событие клика и просто сделать первый выпуск.
https://www.learnrxjs.io/operators/filtering/take.html
Но я бы предложил, чтобы вы подписались на магазин где-то еще, например, в конструкторе вашего компонента:
constructor(store) {
store.pipe(select(selectors.dataSelector)).subscribe(x => {
this.componentX = x;
});
}
, тогда просто щелкнув мышью, вы увидите такие данные:
onClick() {
console.log(this.componentX);
}
Таким образом, вы подписываетесь только один раз, когда компонент инициализируется.
Еще одна вещь о подписках и о том, как предотвратить утечку памяти, - это всегда отписываться, когда компонент уничтожается.
https://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables/