Angular 路由器。在子项之间保持状态,事件用户输入

Angular Router. Keep state between childrens, event user inputs

提问人:victorpacheco3107 提问时间:11/4/2023 更新时间:11/4/2023 访问量:18

问:

我正在使用 Angular 16。我有一个父组件:带有路由。 有两个子路由:带路由和带路由。ComponentA'/parent-component/:customId'ComponentAChildComponent1'/child1'ChildComponent2'/child2'

ComponentA有两个链路和路由器插座,如下所示:

<a routerLink="child1">Child1</a>
<a routerLink="child2">Child2</a>
<router-outlet></router-outlet>

ChildComponent1首先调用API,然后创建动态表单。

当用户导航到 ,填写表单并转到并返回 时,再次加载所有表单(调用 API 并重新创建动态表单),用户将丢失其工作。因此,我想保留用户输入,并且不想再次调用并创建动态表单。child1child2child1child1

有没有一种方法可以持久化状态,甚至是用户在表单条目中写入的内容?child1

Angular-Reactive-Forms 角-路由器 Angular-State-Managmement

评论

0赞 Kurt Hamilton 11/4/2023
您是否有理由宁愿使用路由器插座而不是切换子组件的可见性?如果我要解决这个问题,我会尝试让浏览器做尽可能多的工作 - 在这种情况下,只要你(开发人员)希望它被保留,就保留表单状态。

答:

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)
  }
}