重新加载对话框组件后订阅 BehaviorSubject
Subscribing to BehaviorSubject after reloading the dialog component
这是我已有的代码:
device.service.ts
import {Injectable} from '@angular/core';
import {BehaviorSubject} from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DeviceService {
deviceList: any;
private deviceListSource = new BehaviorSubject(this.deviceList);
currentDeviceList = this.deviceListSource.asObservable();
constructor(){}
getDevices(): void {
this.http.get<any>('https://........')
.subscribe(data => {
this.deviceListSource.next(data.data);
}, error => console.log('Could not GET devices.'));
}
我的对话框组件如下所示:
devices.component.ts
ngOnInit() {
this.deviceService.getDevices();
this.deviceService.currentDeviceList.subscribe(data => {
console.log(data)
});
}
这对于在多个组件之间共享某些值非常有效。当我关闭对话框(devices.component.ts
)并再次重新打开它而不重新加载整个页面时,console.log(data)
命令的执行次数与我已经 opened/closed 对话框的次数一样多。因此,当我打开对话框时,它会依次订阅 .next()
服务添加的所有值。但我希望对话框只订阅服务添加的最后一个值。
据我了解,此 BehaviorSubject
正是针对此用例。我错过了什么吗?还是有另一种(更好的)方法来实现?
关闭对话框后终止订阅。
someSubscription: Subscription
ngOnInit() {
this.deviceService.getDevices();
this.someSubscription = this.deviceService.currentDeviceList.subscribe(data => {
console.log(data)
});
}
ngOnDestroy() {
if (this.someSubscription) {
this.someSubscription .unsubscribe();
}
}
之前的订阅仍然保留流,因此您需要在销毁设备组件之前清除它。一种方法是:
devices.component.ts
destroy$ = new Subject();
ngOnInit() {
this.deviceService.getDevices();
this.deviceService.currentDeviceList
.pipe(takeUntil(this.destroy$)) // takUntil from rxjs
.subscribe(data => {
console.log(data)
});
}
ngOnDestroy(){
this.destroy$.next();
this.destroy$.complete(); // always call complete for guaranteed subscription removal
}
这是我已有的代码:
device.service.ts
import {Injectable} from '@angular/core';
import {BehaviorSubject} from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DeviceService {
deviceList: any;
private deviceListSource = new BehaviorSubject(this.deviceList);
currentDeviceList = this.deviceListSource.asObservable();
constructor(){}
getDevices(): void {
this.http.get<any>('https://........')
.subscribe(data => {
this.deviceListSource.next(data.data);
}, error => console.log('Could not GET devices.'));
}
我的对话框组件如下所示:
devices.component.ts
ngOnInit() {
this.deviceService.getDevices();
this.deviceService.currentDeviceList.subscribe(data => {
console.log(data)
});
}
这对于在多个组件之间共享某些值非常有效。当我关闭对话框(devices.component.ts
)并再次重新打开它而不重新加载整个页面时,console.log(data)
命令的执行次数与我已经 opened/closed 对话框的次数一样多。因此,当我打开对话框时,它会依次订阅 .next()
服务添加的所有值。但我希望对话框只订阅服务添加的最后一个值。
据我了解,此 BehaviorSubject
正是针对此用例。我错过了什么吗?还是有另一种(更好的)方法来实现?
关闭对话框后终止订阅。
someSubscription: Subscription
ngOnInit() {
this.deviceService.getDevices();
this.someSubscription = this.deviceService.currentDeviceList.subscribe(data => {
console.log(data)
});
}
ngOnDestroy() {
if (this.someSubscription) {
this.someSubscription .unsubscribe();
}
}
之前的订阅仍然保留流,因此您需要在销毁设备组件之前清除它。一种方法是:
devices.component.ts
destroy$ = new Subject();
ngOnInit() {
this.deviceService.getDevices();
this.deviceService.currentDeviceList
.pipe(takeUntil(this.destroy$)) // takUntil from rxjs
.subscribe(data => {
console.log(data)
});
}
ngOnDestroy(){
this.destroy$.next();
this.destroy$.complete(); // always call complete for guaranteed subscription removal
}