【问题标题】:How to move subscription from component to resolve如何将订阅从组件移动到解决
【发布时间】:2020-09-10 10:04:16
【问题描述】:

在我的组件中的 Angular 应用程序中,我使用从两个 API 获取数据的 switchMap 对两个 Observables 进行了两次订阅,当组件打开时,我必须显示骨架或加载器,我会阻止它,所以我刚刚阅读了Resolve,据我所知,它预加载了数据,然后激活了路由。

所以我想知道如何将以下订阅从 ngOnInit 移动到解析器

这是我的 ngOnInit 现在的样子

  ngOnInit(): void {
    this.menuService
      .menu(this.idNegozio, this.piva, 'IT')
      .pipe(
        switchMap((menu) =>
          forkJoin([
            of(menu),
            this.pluService.plu(this.idNegozio, this.piva, 'IT'),
          ])
        )
      )
      .subscribe(([menu, plus]) => {
        this.menu = menu;
        this.plus = plus;
        this.filterPlu(menu[0].id);
        if (this.filteredPlu.length) {
          this.ready = true;
        }
      });
  }

同样的组件用于三个路线:

  {
    path: 'asporto',
    component: ProductsComponent,
    canActivate: [ItemsGuardService]
  },
  {
    path: 'takeaway',
    component: ProductsComponent,
  },
  {
    path: 'ecom',
    component: ProductsComponent,
  },

【问题讨论】:

    标签: angular


    【解决方案1】:

    创建解析器

    @Injectable()
    export class MenuResolver implements Resolve<Menu>{
        constructor(private menuService: MenuService, private pluService: PluService) {}
    
        resolve(route: ActivatedRouteSnapshot): Observable<Menu> {
            const piva = route.parent.params.piva;
            const negozio = route.parent.params.negozio;
    
            return  this.menuService
            .menu(negozio, piva, 'IT')
            .pipe(
              switchMap((menu) =>
                forkJoin([
                  of(menu),
                  this.pluService.plu(negozio, piva, 'IT'),
                ])
              ),
              map(([menu, plus]) => ({ menu, plus }))
            );
        }
    }

    在你的路由定义中使用它并在你的父模块中提供它

    const routes: Routes = [
     {
            path: '',
            resolve: { menu: MenuResolver },
            component: Component,
     }
    ];
    
    @NgModule({
      imports: [
            RouterModule.forChild(routes),
      ],
      providers: [
        MenuResolver,
      ]
    })
    export class MyModule { }

    然后通过 ActivatedRoute 在你的组件中获取它

    export class MyComponent {
      menu: Menu;
      plus: MenuDetails;
     
      constructor(private route: ActivatedRoute){}
      
      ngOnInit() {
        const menuData = this.route.snapshot.data.menu;
        this.menu = menuData.menu;
        this.plus = menuData.plus;
      }
    }

    您必须将解析器添加到所有相关路由,并在组件中以相同的方式使用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2012-06-25
      • 1970-01-01
      • 2020-04-14
      • 2011-12-11
      • 2015-07-13
      相关资源
      最近更新 更多