我假设您是sharemodalComponent
从callingmodal
. 在这种情况下,您可以使用单例服务在它们之间共享数据。尝试以下
共享服务.ts
@Injectable({providedIn: 'root'})
export class SharedService {
private _sharingWithSource = new BehaviorSubject<any>(null);
private _selectedPermissionTypeSource = new BehaviorSubject<any>(null);
public sharingWith$ = this._sharingWithSource.asObservable();
public selectedPermissionType$ = this._selectedPermissionTypeSource.asObservable();
set sharingWithSource(value: any) {
this._sharingWithSource.next(value);
}
set selectedPermissionTypeSource(value: any) {
this._selectedPermissionTypeSource.next(value);
}
}
sharemodalComponent.component.ts
export class SharemodalComponent implements OnInit {
constructor(private sharedService: SharedService) { }
onaddCus(): void {
this.sharedService.sharingWithSource = this.sharingWith;
this.sharedService.selectedPermissionTypeSource = this.addCusForm.value.selectedPermissionType;
console.log(this.sharingWith);
console.log(this.addCusForm.value.selectedPermissionType);
}
}
并且在调用模态组件中,订阅ngOnInit
钩子以捕获所有推送到可观察对象的通知。
调用modal.component.ts
export class CallingmodalComponent implements OnInit, OnDestroy {
completed$ = new Subject<any>();
constructor(private sharedService: SharedService) { }
ngOnInit() {
this.sharedService.sharingWith$.pipe(
takeUntil(this.completed$)
).subscribe(
value => {
if (value) { // <-- default value is `null`
this.sharingWith = value
}
}
);
this.sharedService.selectedPermissionType$.pipe(
takeUntil(this.completed$)
).subscribe(
value => {
if (value) {
this.selectedPermissionType = value
}
}
);
}
openDialog(): void {
const dialogRef = this.dialog.open(SharemodalComponent, {
width: '640px', disableClose: true
});
console.log(dialogRef);
}
ngOnDestroy() {
this.completed$.next(); // <-- close the observables
this.completed$.complete();
}
}
更新 - 解释
RxJS BehaviorSubject
- 多播可观察 RxJS 的变体Subject
。它可以保存推送给它的当前数据,并在订阅时立即发出。这就是它需要一个初始值(我们null
在这里使用)并且我们在分配值之前检查的原因。
next
行为主体的方法用于将新值推送到可观察对象。推送通知的其他有效方法是error
和complete
。推送到error
将调用观察者中的错误回调,调用complete
将完成可观察流。
每当涉及订阅时,打开/未关闭的订阅都会存在潜在的内存泄漏。因此,在它的OnDestroy
钩子中关闭组件中的订阅总是一个好习惯。一种方法是将订阅分配给局部变量并调用unsubscribe()
它。其他优雅的方式是使用 RxJStakeUntil
操作符。有关此方法的更多信息,请点击此处。
这是 RxJS 团队的核心成员关于何时使用asObservable()
函数的一个很好的解释。