import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable({
providedIn: 'root'
})
class Service {
public dataUpdated$ = new Subject();
public getData() {
return this.http.get(URL);
}
public updateData(body) {
return this.http.patch(URL, body);
}
}
接下来,我们在两个组件中进行订阅:
import { takeUntil } from 'rxjs/operators/takeUntil';
class AComponent implements OnDestroy {
private destroy$ = new Subject<void>();
constructor(service: Service) {
service.dataUpdated$.asObservable().pipe(takeUntil(this.destroy$)).subscribe((data) => {
console.log('Новый объект: ', data);
});
}
public ngOnDestroy(): void {
this.destroy$.next();
this.destroy$.complete();
}
}
class BComponent implements OnDestroy {
private destroy$ = new Subject<void>();
constructor(service: Service) {
service.dataUpdated$.asObservable().pipe(takeUntil(this.destroy$)).subscribe((data) => {
console.log('Новый объект: ', data);
});
}
public ngOnDestroy(): void {
this.destroy$.next();
this.destroy$.complete();
}
}
您还需要知道发生了什么变化,我希望您的 API 返回更改后的模型:
import { tap } from 'rxjs/operators/tap';
public updateData(body) {
return this.http.patch(URL, body).pipe(
tap((data) => this.dataUpdated$.next(data))
);
}
只需在同一服务中创建一个事件生成器,它将为两个订阅者触发一个事件:
接下来,我们在两个组件中进行订阅:
您还需要知道发生了什么变化,我希望您的 API 返回更改后的模型:
如果没有,那么您手动改变对象并
tap通过它生成一个事件。