美文网首页
SAP Spartacus Site Context 实现专题页

SAP Spartacus Site Context 实现专题页

作者: _扫地僧_ | 来源:发表于2022-07-10 08:56 被阅读0次

    @[toc]

    Site Context 的实现位于 core\src\ 文件夹之下。

    实现总共分下列八大部分:

    site-context.module.ts

    绝大多数 import 都是 site-context 文件夹自身的子文件夹提供的:

    上图第一行,从 @angular/core 导入 ModuleWithProviders,这是一个包装器:

    将 NgModule 与provider关联的 NgModule 的包装器。不推荐使用没有泛型类型的用法。
    该 Module 对外只暴露了两个方法:

    initSiteContextConfig

    注入值:

    • SiteContextConfigInitializer
    • SiteContextConfig

    如果 context 的 context 值被填充,那么就返回 SiteContextConfigInitializer 实例,否则返回 null.

    第 27 行的 | 代表联合类型。

    forRoot

    提供 global provider:


    这个 forRoot 方法在 base-core.module.ts 的 imports 区域被调用。

    config

    先查看 index.ts,从三个 TypeScript 文件导入:

    export * from './config-loader/site-context-config-initializer';
    export * from './context-config-utils';
    export * from './site-context-config';
    

    config-loader/site-context-config-initializer.js

    还是先看其 import 部分,从 site-context 的上层目录,即 core/src 里导入了:

    • ConfigInitializer
    • BaseSite
    • JavaRegExpConverter
    • WindowRef


    实现了 configInitializer 接口。

    这个接口定义在 config 文件夹里,包含了字符串数组类型的 scopes 属性,以及 configFactory,后者是一个函数,返回 Config 的 Promise.

    Config 是一个纯虚 class:

    export abstract class Config {}
    

    所以为了实现该接口,依次定义了 scopes 值为 context 字符串常量,以及调用自己的 resolveConfig 方法,返回一个 promise 对象。

    构造函数里注入的三个属性,都是从 config 里导入的。

    resolveConfig

    调用 baseSiteService,取得所有的 baseSite,然后调用第 40 行的 find 方法,返回满足 predicate 函数的 单个 site 实例:

    从错误消息 Error: Cannot get base site config! Current url (${this.currentUrl}) doesn't match any of url patterns of any base sites. 似乎能看出,第 40 行代码根据当前 url 来判断是否能 match 到某个定义好的 base site.

    最后,在第 50 行的 map 里,执行 projection,将 baseSite 映射成其配置信息。

    相关文章

      网友评论

          本文标题:SAP Spartacus Site Context 实现专题页

          本文链接:https://www.haomeiwen.com/subject/dlfibrtx.html