当一个父组件下的不一样子组件须要进行传递数据时,咱们能够选择经过Angular中的service传值bash
在RxJS中,Subject是一类特殊的Observable,它能够向多个Observer多路推送数值。普通的Observable并不具有多路推送的能力(每个Observer都有本身独立的执行环境),而Subject能够共享一个执行环境。BehaviorSubject是Subject的一个衍生类,它将数据流中的最新值推送给接受者函数
在公共父组件的service中先定义一个BehaviorSubject
$openTabs: BehaviorSubject<Set<ITab>> = new BehaviorSubject<Set<ITab>>(new Set());[set是Angular中的构造函数]
$openTabIndex: BehaviorSubject<number> = new BehaviorSubject<number>(-1);
// 获取这个须要在不一样子组件中共享的值 其中一个子组件A中须要经过subscribe来订阅这个方法获取修改后的变量
getOpenTabs(): Observable<Set<ITab>> {
return this.$openTabs.asObservable();
}
getOpenTabIndex(): Observable<number> {
return this.$openTabIndex.asObservable();
}
//另外一个子组件B经过调用此方法来修改公用的变量并经过next的方式进行通知,好比工具栏上的删除按钮的调用
openTab(tab: ITab): void {
const openTabsValue = this.$openTabs.getValue();
const openTabs = Array.from(openTabsValue);
const index = openTabs.findIndex((value: ITab) => value.name === tab.name);
if (index === -1) {
openTabsValue.add(tab);
this.$openTabs.next(openTabsValue);
this.$openTabIndex.next(openTabsValue.size);
}
}
复制代码
子组件A中的调用代码
constructor(private _commonService: TestService) {
_commonService.getOpenTabIndex().subscribe((res) => {
if (res) {
//得知变量变化后,须要执行的逻辑
}
})
}
复制代码
子组件B中的调用代码
<span (click)="commonService.openTab()"></span>
复制代码
在公共父组件的service中先定义一个Subject
$addData: Subject<any> = new Subject(); 经过$addData去next相关的值
子组件A中的调用代码,来获取变化后的数据
constructor(private _commonService: TestService) {
_commonService.$addData.subscribe((res) => {
if (res) {
//得知变量变化后,须要执行的逻辑
}
})
}
子组件B经过调用此方法来修改公用的变量并经过next的方式进行通知
this._xxService.$addData.next(medicalData)
复制代码
不只是service能够经过subject进行传值,也能够在组件中使用subject进行next(),在另一个组件中经过subscribe进行获取工具