有没有办法可以跨步进组件的各个步骤共享数据?
例如,在下面的代码中,我希望以app-step1
形式填写的数据在app-step2
组件中可用。
<mat-horizontal-stepper [linear]="true" #stepper="matHorizontalStepper" >
<mat-step [stepControl]="zerpFormGroup" >
<ng-template matStepLabel>Step I</ng-template>
<app-step1 [stepper]="stepper"></app-step1>
</mat-step>
<mat-step [stepControl]="firstFormGroup" >
<ng-template matStepLabel ">Step II</ng-template><br>
<app-step2 [stepper]="stepper"></app-step2>
</mat-step>
答案 0 :(得分:2)
使用服务来处理主题(或ReplaySubject)的更改。
例如:
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { SharedData } from '@app/models/shared-data.model';
@Injectable()
export class StepperDataService {
public dataChange = new Subject<SharedData>();
setData(data: SharedData) {
this.dataChange.next(data);
}
}
在要更改数据的组件中,只需调用setData方法即可。
export class Step1Component implements OnInit {
...
constructor(private sdService: StepperDataService) { }
...
onDataChanged() {
const data: SharedData = { data to transmit };
this.sdServices.setData(data);
}
在要接收更改数据的组件中,您订阅了主题dataChange。
export class Step2Component implements OnInit, OnDestroy {
private sub: Subscription;
...
constructor(private sdService: StepperDataService) { }
...
ngOnInit(): void {
this.sub = this.sdServices.dataChange
.subscribe((data: SharedData) => {
// do whatever you need with the shared data
});
}
答案 1 :(得分:1)
恢复了这个。使用@ Output / @ Input的组合。 @Output装饰器在子组件1中与EventEmitter一起使用。此事件发射器在我想要传递的字段中发出值,然后在父组件中捕获(在本例中为我的步进器组件。然后使用@Input装饰器将该值传递给子组件2。
答案 2 :(得分:0)
您可以使用@input装饰器声明输入属性并将相同的变量绑定到两个组件:
<mat-horizontal-stepper [linear]="true" #stepper="matHorizontalStepper" >
<mat-step [stepControl]="zerpFormGroup" >
<ng-template matStepLabel>Step I</ng-template>
<app-step1 [stepper]="stepper" [sharedProperty]="someExpresion"></app-step1>
</mat-step>
<mat-step [stepControl]="firstFormGroup" >
<ng-template matStepLabel ">Step II</ng-template><br>
<app-step2 [stepper]="stepper" [sharedProperty]="someExpresion"></app-step2>
</mat-step>
然后在您的app-step1
和app-step2
组件中,您声明了这样的输入属性:
@Input sharedProperty;
有关详细信息,您可以在Angular docs中看到更详细的示例。