Это повтор этого вопроса , который, я полагаю, я задал неправильно
Я пытаюсь обнаружить изменения, внесенные компонентом, подписанным на услугу.Файл компонента:
import { Component, OnInit } from '@angular/core';
import {Item} from './app.module';
import { DataService } from './data.service';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {
items: Item[];
constructor(
public dataService: DataService
){
}
ngOnInit(){
this.dataService.getItems().subscribe(items=>{
this.items = items;
});
}
}
, а service.ts:
import { Injectable } from '@angular/core';
import { BehaviorSubject , Observable, of, throwError } from 'rxjs'
import { Item } from './app.module';
@Injectable()
export class DataService {
private _items: BehaviorSubject<Item[]> = new BehaviorSubject([]);
public readonly items$: Observable<Item[]> = this._items.asObservable();
private first:boolean = true;
constructor() {
this._items.next([{name:'first',id:1},{name:'second',id:2}] as Item[]);
this.monitorChanges();
}
getItems(): Observable <Item[]>{
return this.items$;
}
monitorChanges(){
this._items.subscribe(items => {
console.log("_items updated");
});
}
}
Как реализовать monitorChanges()
, чтобы он запускался всякий раз, когда компонент вносит изменения в свой локальныйthis.items?Я планирую использовать компонент, чтобы редактировать элементы и затем синхронизировать изменения службы с сервером.Спасибо!
Живой пример включен Stackblitz
Запуск: угловой CLI: 6.0.3 угловой: 6.0.1 rxjs: 6.1.0
~~~~~~~
Я обнаружил свое невежество - Я действовал исходя из предположения, что .subscribe (x => this.x = x) создал новую копию xчто Angular магически отслеживается.Я надеялся, что есть какой-то способ использовать это, чтобы обнаружить изменения.Это неверноВсе мои компоненты манипулируют одним и тем же объектом, наблюдаемое просто передает ссылки.Это даже относится к .pipe (map (...)).