Я бы создал BehaviourSubject
в ListService
и выставил бы его asObservable
.И затем также создайте два метода на этом.Один (initializeList
) получит данные из API, и это вызовет инициализацию BehaviourSubject
в этой службе.Другой (modifyList
) изменил бы данные и вызвал бы обновление BehaviourSubject
.
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class ListService {
url = 'https://jsonplaceholder.typicode.com/users';
private list: BehaviorSubject<any> = new BehaviorSubject<any>(null);
list$ = this.list.asObservable();
constructor(private http: HttpClient) {}
initializeList() {
this.http.get(this.url)
.subscribe(list => this.list.next(list));
}
modifyList(changedList) {
// Make further modifications to the changedList and then:
this.users.next(changedUsers);
}
}
Затем в моем компоненте я сначала вызвал бы listService.initializeList
, который инициализирует list
BehaviorSubject
в списке.И тогда я бы подписался на list$
observable
.
list: any[];
constructor(
private listService: ListService
) {}
ngOnInit() {
this.listService.initializeList();
this.listService.list$()
.subscribe(
res => {
this.list = res;
},
err => {
console.log(err);
}
);
}
passList() {
this.listService.modifyList(this.list);
}