Я предполагаю, что вы динамически создаете sharemodalComponent
из callingmodal
. В этом случае вы можете обмениваться данными между ними с помощью одноэлементной службы . Попробуйте следующее
shared.service.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
для захвата всех отправленных уведомлений в наблюдаемые.
callmodal.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();
}
}
Обновление - объяснение
Rx JS BehaviorSubject
- вариант наблюдаемого многоадресного приема Rx JS Subject
. Он может удерживать переданные ему текущие данные и отправлять их сразу после подписки. По этой причине для этого требуется начальное значение (здесь мы используем null
), и мы проверяем, прежде чем присвоить значение.
next
метод объекта поведения используется для pu sh новое значение наблюдаемого. Другие допустимые методы для уведомлений pu sh: error
и complete
. Нажатие на error
вызовет обратный вызов ошибки в наблюдателе, а вызов complete
завершит наблюдаемый поток.
Всякий раз, когда задействована подписка, возникает потенциальная утечка памяти из открытого / Незакрытые подписки. Так что всегда полезно закрывать подписки в компоненте с помощью хука OnDestroy
. Один из способов - присвоить подписку локальной переменной и вызвать для нее unsubscribe()
. Другой элегантный способ - использовать оператор Rx JS takeUntil
. Подробнее об этом подходе здесь .
Здесь - хорошее объяснение от основного члена команды Rx JS о том, когда используйте функцию asObservable()
.