SAP Spartacus Site Context 实现专题页面

@[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 实现专题页面)