angular - 如何将订阅从组件移动到解决
问题描述
在我的组件中的 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,
},
解决方案
创建解析器
@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;
}
}
您必须将解析器添加到所有相关路由,并在组件中以相同的方式使用它
推荐阅读
- java - 为什么 setContentView(R.layout.activity_main) 和 findViewById(R.id.example) 不使用点符号来引用对象?
- spring - 同一测试中的不同控制器
- arrays - 遍历非连续列
- javascript - 使用 NodeJS 读取 PDF 并在客户端呈现上下文
- mysql - 选择和使用两个表(更详细的解释在帖子中)
- excel - Excel - 如何获得最后一个由数字和“N/A”随机混合组成的行中最后 10 个值的平均值
- ios - 在苹果商店添加评论信息截图?
- wordpress - Elementor 小部件分离问题
- python - “!”是什么意思?在python中登录吗?或者它是一个Linux commad?
- javascript - MongoDB:你可以将一个集合作为一个字段包含在另一个集合的文档中吗?