提问人:victorpacheco3107 提问时间:11/4/2023 更新时间:11/4/2023 访问量:18
Angular 路由器。在子项之间保持状态,事件用户输入
Angular Router. Keep state between childrens, event user inputs
问:
我正在使用 Angular 16。我有一个父组件:带有路由。 有两个子路由:带路由和带路由。ComponentA
'/parent-component/:customId'
ComponentA
ChildComponent1
'/child1'
ChildComponent2
'/child2'
ComponentA
有两个链路和路由器插座,如下所示:
<a routerLink="child1">Child1</a>
<a routerLink="child2">Child2</a>
<router-outlet></router-outlet>
ChildComponent1
首先调用API,然后创建动态表单。
当用户导航到 ,填写表单并转到并返回 时,再次加载所有表单(调用 API 并重新创建动态表单),用户将丢失其工作。因此,我想保留用户输入,并且不想再次调用并创建动态表单。child1
child2
child1
child1
有没有一种方法可以持久化状态,甚至是用户在表单条目中写入的内容?child1
答:
1赞
Junaid Firdosi
11/4/2023
#1
由于您使用的是路由器出口,因此您不能使用父组件来保留状态,但无论如何,最好使用共享服务中的行为主体来管理同级组件之间的状态
所以服务文件是这样的
export class CompAService {
private formState$: BehaviorSubject<YourFormInterface | undefined> = new BehaviorSubject(undefined);
constructor() { }
getFormState() : Observable<YourFormInterface> {
return this.formState$.asObservable()
}
updateFormState(state:YourFormInterface): void {
this.formState$.next(state)
}
}
在 Component1 ts 文件中,您将订阅每次组件加载到视图中时获取表单状态,如果组件在第一次加载时加载,您将在订阅中收到“undefined”,您可以调用 API 来获取状态所需的任何数据
@Component({
selector: '...',
templateUrl: '...',
styleUrls: ['...']
})
export class Child1Component {
form: FormGroup = new FormGroup() // your form group
constructor(private compAService:CompAService, private destroyRef:DestroyRef){}
ngOnInit():void{
this.compAService.getFormState().pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(state=>{
if (!state) {
this.setFormState()
}else {
this.form.patchValue(...state) // set all your values to the form
}
})
}
setFormState():void {
// on receiving your response from api call OR receiving values from your
// html form, set the state so you get it the next time
this.compAService.updateFormState(state)
}
}
评论