typescript 声明式方法订阅和接收Angular中不相关组件之间的更改?

azpvetkf  于 2023-05-30  发布在  TypeScript
关注(0)|答案(1)|浏览(133)

问题陈述:

  • 我有一个 Jmeter 板(父组件),其中有侧边栏和导航栏(子组件)。
  • 在侧边栏中,我在链接上应用了自定义权限指令,用于检查范围是否具有查看权限。
  • 在导航栏,我有一个管理员,经理和工作人员角色选项菜单&当用户更改角色
  • 我想改变侧边栏链接的基础上,改变了范围的权限。

我试着把observable传递到侧边栏

scope$: Observable<Roles> = this.scopeService.scope$;

使用aysnc管道

<app-sidebar [scope]="scope$ | async"></app-sidebar>

在ngOnInit中订阅(& S)

ngOnInit(): void {
    this.scopeService.scope$.subscribe();
  }

但它不起作用
我看到过使用事件发射器的帖子,但我真的想使用声明式模式。
这里是stackblitz链接,以获得更简短的信息。

xriantvc

xriantvc1#

这不是async pipe的工作方式。异步管道自动订阅observable,并获取其值。在你的情况下,你不想这样做,你只是想通过可观察的。你不需要使用async pipe,只需要这样做:

<app-sidebar [scope$]="scope$"></app-sidebar>

在app-sidebar中:

@Input
scope$: Observable<Roles> = this.scopeService.scope$;

ngOnInit(): void {
    this.scope$.subscribe();
  }

编辑:
在检查了你的stackblitz之后,我知道你的问题在哪里了。在你的has-permission指令中,你使用了作用域的snapshot而不是订阅它。你应该这样做:

ngOnInit(): void {
    this.scopeService.scope$.subscribe((newScope) => {
      this.scope = newScope;
      this.checkPermissions();
    });
  }

这样,每次范围更改时,都会调用checkPermissions()方法。您仍然需要修复如何显示元素,因为它存在一些问题。您似乎没有清除scole已经拥有权限的选项,并且创建了一个新选项,使其重复。你可以通过像这样制作showElement来修复它:

showElement(canShow: boolean): void {
    this.viewContainer.clear();
    if (canShow) {
      this.viewContainer.createEmbeddedView(this.templateRef);
    }
  }

相关问题