combineLatest(
this.httpClient.get('/WebApi/cloud-soc-main/dist/assets/config/config.json') as Observable<any>,
this.menuService.getMenu(),
).subscribe(
(results) => {
const [registerAppConfig] = results;
const registerApps = registerAppConfig.data;
if (registerApps.length > 0) {
this.registryMicroApp(registerApps); //注册apps数组
}
},
() => { //对于error的处理
this.findIpToHomePage();
},
);
destroy$ = new Subject();
merge(
this.microAppMaintainer.afterMount(),
this.router.events.pipe(filter((action) => action instanceof NavigationEnd)),
)
.pipe(takeUntil(this.destroy$))
.subscribe(() => {
this.menuService.matchActiveMenu();
});
这段代码使用了 RxJS 中的操作符来组合两个 Observable,并在特定条件下执行一些逻辑。
首先,让我们逐步解读代码:
this.microAppMaintainer.afterMount()
返回一个 Observable,表示微应用加载完成后的事件或状态。this.router.events.pipe(filter((action) => action instanceof NavigationEnd))
返回一个 Observable,它筛选出路由导航事件中的NavigationEnd
事件。merge
操作符将这两个 Observable 合并成一个,只要其中一个发出事件,就会将该事件传递给下游。pipe(takeUntil(this.destroy$))
使用pipe
操作符将takeUntil
操作符应用于上一步合并的 Observable。takeUntil
会监听另一个 Observablethis.destroy$
,一旦destroy$
发出事件,就会停止监听上游 Observable。subscribe(() => { this.menuService.matchActiveMenu(); })
订阅了上述组合后的 Observable,并指定回调函数。当这个 Observable 发出事件时,就会执行回调函数,在这里调用了menuService
的matchActiveMenu()
方法,用于匹配激活的菜单。
总结起来,这段代码的逻辑是:监听微应用加载完成事件和路由导航结束事件,一旦有事件发生,就执行 matchActiveMenu()
方法,用于匹配激活的菜单。同时,通过 takeUntil
确保在 destroy$
发出事件时停止监听,以避免内存泄漏或不必要的事件处理。
什么是NavigationEnd?
NavigationEnd
是 Angular 路由器事件(RouterEvent
)的一种类型,表示导航成功结束的事件。它是 Angular 路由器事件的一种子类,用于通知应用程序导航到新页面的结束。
当你在 Angular 应用中导航到一个新页面时,路由器会触发一系列的导航事件,其中之一就是 NavigationEnd
。这个事件会在导航成功结束后广播。
通常情况下,NavigationEnd
事件在路由导航到新页面后,新页面的组件已经加载并渲染完成。你可以监听这个事件来执行一些在导航结束后需要进行的操作,比如页面的初始化、数据的加载或其他逻辑的处理。
我们分析一下this.microAppMaintainer.afterMount()到底是干嘛的,怎么进行状态的转化?
这段代码定义了一个方法 registryLifeCycles()
,该方法返回一个对象,这个对象包含了微前端应用生命周期钩子函数的配置。
具体解释如下:
beforeLoad
、beforeMount
、afterMount
、beforeUnmount
和afterUnmount
是微前端应用的生命周期钩子函数。- 这些钩子函数分别在微应用的不同阶段被调用,例如在加载前、挂载前、挂载后、卸载前和卸载后。
- 对于每个生命周期阶段,都定义了一个函数,这个函数会在对应阶段触发时执行。
- 在每个函数内部,会触发一个对应阶段的事件,例如在
beforeLoad
阶段触发triggerAppBeforeLoad$
事件,并传递true
作为参数。 - 返回一个
Promise.resolve()
,表示在对应阶段执行后,返回一个已解决(resolved)的 Promise。
总的来说,这段代码的作用是配置微前端应用的生命周期钩子函数,以及在每个生命周期阶段触发相应的事件。这样可以在不同阶段执行相应的逻辑或处理。
this.menuService
.menuChange()
.pipe(takeUntil(this.destroy$))
.subscribe((menu) => {
if (menu) {
const productAndService = this.menuService.flattenedMenu
.filter((item) => item.i18n.startsWith('menu.service'))
.map((item) => ({
i18n: item.i18n,
id: item.id,
key: item.key,
link: item.link,
menu_id: item.menu_id,
name: item.name,
p_menu_id: item.p_menu_id,
pid: item.pid,
purchased: item.purchased,
service_id: item.service_id,
unpurchased_link: item.unpurchased_link,
}));
this.microAppStore.updateState({ productAndService });
}
});
this.menuService.matchActiveMenu()?是干嘛的?
1.menu.service.ts服务
afterMount() {
return this.triggerAppAfterMount$.asObservable();
}
menuChange(): Observable<Menu> {
return this.triggerMenuChange$.asObservable();
}
返回一个可观察对象(observable),允许外部订阅此对象以接收触发菜单变化的通知。