Skip to content
js
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();
    },
);
ts
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,并在特定条件下执行一些逻辑。

首先,让我们逐步解读代码:

  1. this.microAppMaintainer.afterMount() 返回一个 Observable,表示微应用加载完成后的事件或状态。
  2. this.router.events.pipe(filter((action) => action instanceof NavigationEnd)) 返回一个 Observable,它筛选出路由导航事件中的 NavigationEnd 事件。
  3. merge 操作符将这两个 Observable 合并成一个,只要其中一个发出事件,就会将该事件传递给下游。
  4. pipe(takeUntil(this.destroy$)) 使用 pipe 操作符将 takeUntil 操作符应用于上一步合并的 Observable。takeUntil 会监听另一个 Observable this.destroy$,一旦 destroy$ 发出事件,就会停止监听上游 Observable。
  5. subscribe(() => { this.menuService.matchActiveMenu(); }) 订阅了上述组合后的 Observable,并指定回调函数。当这个 Observable 发出事件时,就会执行回调函数,在这里调用了 menuServicematchActiveMenu() 方法,用于匹配激活的菜单。

总结起来,这段代码的逻辑是:监听微应用加载完成事件和路由导航结束事件,一旦有事件发生,就执行 matchActiveMenu() 方法,用于匹配激活的菜单。同时,通过 takeUntil 确保在 destroy$ 发出事件时停止监听,以避免内存泄漏或不必要的事件处理。

什么是NavigationEnd?

NavigationEnd 是 Angular 路由器事件(RouterEvent)的一种类型,表示导航成功结束的事件。它是 Angular 路由器事件的一种子类,用于通知应用程序导航到新页面的结束。

当你在 Angular 应用中导航到一个新页面时,路由器会触发一系列的导航事件,其中之一就是 NavigationEnd。这个事件会在导航成功结束后广播。

通常情况下,NavigationEnd 事件在路由导航到新页面后,新页面的组件已经加载并渲染完成。你可以监听这个事件来执行一些在导航结束后需要进行的操作,比如页面的初始化、数据的加载或其他逻辑的处理。

我们分析一下this.microAppMaintainer.afterMount()到底是干嘛的,怎么进行状态的转化?

这段代码定义了一个方法 registryLifeCycles(),该方法返回一个对象,这个对象包含了微前端应用生命周期钩子函数的配置。

具体解释如下:

  • beforeLoadbeforeMountafterMountbeforeUnmountafterUnmount 是微前端应用的生命周期钩子函数。
  • 这些钩子函数分别在微应用的不同阶段被调用,例如在加载前、挂载前、挂载后、卸载前和卸载后。
  • 对于每个生命周期阶段,都定义了一个函数,这个函数会在对应阶段触发时执行。
  • 在每个函数内部,会触发一个对应阶段的事件,例如在 beforeLoad 阶段触发 triggerAppBeforeLoad$ 事件,并传递 true 作为参数。
  • 返回一个 Promise.resolve(),表示在对应阶段执行后,返回一个已解决(resolved)的 Promise。

总的来说,这段代码的作用是配置微前端应用的生命周期钩子函数,以及在每个生命周期阶段触发相应的事件。这样可以在不同阶段执行相应的逻辑或处理。

js
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服务

js
afterMount() {
    return this.triggerAppAfterMount$.asObservable();
}

menuChange(): Observable<Menu> {
    return this.triggerMenuChange$.asObservable();
}

返回一个可观察对象(observable),允许外部订阅此对象以接收触发菜单变化的通知。