RxJS BehaviourSubject订阅在onInit中调用一次



我是RxJS的新手,但我想学习。目前我面临一些问题:我有一个父组件(渲染弹出窗口和表格组件(

providers: [
DataService
]
class AppComponent {
constructor(private readonly dialogService: DialogService) {
//init something
}

openNewTestDataDialog(): void {
let ref = this.dialogService.open(TestComponent, {
header: 'New Test',
closable: true,
closeOnEscape: true,
autoZIndex: true,
data: {
data: undefined
}
});
}
}

这里我有DinamicDialog测试组件-它的模式,我可以在其中添加项目并保存它

class CompanyDetailsComponent { 
constructor(private readonly dataService: DataService) {
//
}

updateItem(updatedItem?: Item) {
if (updatedItem.id) {
this.dataService.updateItem(updatedItem).subscribe(
data => this.dataService.getItems(),//here I'm trying to emit getting new data
error => this.handleError(error)
);
} 
}
}

此外,我还有另一个组件,它有订阅

class TableComponent {
subscription: Subscription | undefined;
items: Item[] = [];

constructor(private readonly dataService: DataService) {
//
}

ngOnInit() {
this.subscription = this.dataService.getItemSubject().subscribe(x => {
if(x) {
this.items = x;
}
});
this.dataService.getItems();
}
}

服务:

@Injectable({
providedIn: 'root'})
export class DataService {
itemSubject = new BehaviorSubject<Item[]>([]);
constructor(private readonly httpClient: HttpClient) {
}
getItemSubject(): Observable<any> {
return this.itemSubject.asObservable();
}
getItems() {
const url = decorateUrl(UrlConstants.ULR_ITEM);
this.httpClient.get<Company[]>(url)
.subscribe(items => this.itemSubject.next([...items]));
}
}

问题是:TableComponent中的订阅只在呈现该组件时调用一次,并且当我尝试在弹出观察者数组中添加新项目时,BehaviorSubject为空。我做错了什么?谢谢

服务的常见用法应该使实例独立于组件而存在。

也许可以将其从组件提供商中删除,并将其放入模块提供商中,这将有助于

相关内容

最新更新