SAP 电商云 Spartacus UI BaseSiteInitializer 的实现明细

简介: SAP 电商云 Spartacus UI BaseSiteInitializer 的实现明细

services

currentcy 和 language,都有持久化。base site 没有。Service 里还包含通过 url 设置 context 的实现类。总共分 4 组实现。

60.png

base-site-initializer.ts(BaseSiteInitializer)

首先,这个类是 Injection Token APP_INITIALIZER 的 provider,在应用程序初始化时执行。

通过构造函数注入的参数,第一个参数来自 facade 文件夹下的 Service 实现,第二个来自 site-context 同级的 config 文件夹。

@Injectable({ providedIn: 'root' })
export class BaseSiteInitializer implements OnDestroy {
  constructor(
    protected baseSiteService: BaseSiteService,
    protected configInit: ConfigInitializerService
  ) {}

initialize

这个方法加载默认值,被 APP_INITIALIZER 的 provider 调用。

  initialize(): void {
    this.subscription = this.configInit
      .getStable('context')
      .pipe(
        // TODO(#12351): <--- plug here explicitly SiteContextRoutesHandler
        switchMap(() => this.setFallbackValue())
      )
      .subscribe();
  }

setFallbackValue

protected setFallbackValue(): Observable<unknown> {
    return this.configInit
      .getStable('context')
      .pipe(
        tap((config: SiteContextConfig) => this.setDefaultFromConfig(config))
      );
  }

这里的 this.configInit.getStable(‘context’) 留待将来研究。

setDefaultFromConfig

从 config 的默认值设置 Active Base Site:

protected setDefaultFromConfig(config: SiteContextConfig): void {
    if (!this.baseSiteService.isInitialized()) {
      this.baseSiteService.setActive(
        getContextParameterDefault(config, BASE_SITE_CONTEXT_ID)
      );
    }
  }

我们可以从调试器里观察一下运行时的行为:

所有的 APP_INITIALIZER provider 被调用,包括本章节正在介绍的 BaseSiteInitializer 的 initialize 方法:

61.png

subscribe 最终导致 setDefaultFromConfig 被调用:

62.png

此时 context 的所有值都已经就位了。

currency-state-persistence.service.ts (CurrencyStatePersistenceService)

注入的三个依赖:

export class CurrencyStatePersistenceService {
  constructor(
    protected statePersistenceService: StatePersistenceService,
    protected currencyService: CurrencyService,
    protected config: SiteContextConfig
  ) {}

(1) 来自 state 文件夹

(2) 来自 site-context facade 文件夹下

(3) 就是一个 abstract class,包含 urlParameters 属性,类型为 string[], 以及 [contextName: string]: string[]

initSync

这个方法调用了 state 文件夹下的 StatePersistenceService,传递 key,state$ 和 onRead 三个参数。

image.png

关于 CurrencyService 的 isInitialized 方法,我加了 config.log, 两次打印都是 true:

63.png

64.png

onRead

成功从 localstorage 里读取到了 USD,但是没有进入代码 29 行的 IF 分支,∵ currencyService.isInitialized 返回了 true:

65.png

所以这里没有执行 setActive 方法。setActive 方法是通过 url 解析而触发调用的:

66.png

总结

本文依次介绍了 SAP 电商云 Spartacus UI BaseSiteInitializer 类的实现明细。这个类主要作为 APP_INITIALIZER provider 的实现之一,useFactory 的工厂函数,initializeBaseSite,在这个工厂函数的实现里,通过依赖注入 BaseSiteInitializer 的实例,并调用其公有的 initialize 方法完成默认值的设置。


目录
相关文章
|
7月前
SAP 电商云 Spartacus UI production build 时遇到和 orderCore 相关的错误
SAP 电商云 Spartacus UI production build 时遇到和 orderCore 相关的错误
32 0
|
6月前
|
API
SAP Spartacus UI 通过 HTTP Interceptor 给请求添加 Authorization 字段的源代码分析
SAP Spartacus UI 通过 HTTP Interceptor 给请求添加 Authorization 字段的源代码分析
32 1
|
16天前
|
网络架构 开发者 UED
Spartacus 2211 的 provideOutlet 方法扩展 UI
Spartacus 2211 的 provideOutlet 方法扩展 UI
8 0
Spartacus 2211 的 provideOutlet 方法扩展 UI
|
3月前
|
搜索推荐 开发者 UED
关于 SAP Spartacus 层的 UI 设计
关于 SAP Spartacus 层的 UI 设计
39 0
|
6月前
|
JSON 前端开发 API
SAP Spartacus UI 中的 CmsTicketInterceptor
SAP Spartacus UI 中的 CmsTicketInterceptor
39 0
|
6月前
|
Web App开发 JavaScript Java
SAP 电商云 Spartacus UI External Route 的模块实现概述
SAP 电商云 Spartacus UI External Route 的模块实现概述
52 0
|
6月前
SAP 电商云 Spartacus UI UrlMatcherService 的用法介绍 - External Route 工作的单步调试(二)
SAP 电商云 Spartacus UI UrlMatcherService 的用法介绍 - External Route 工作的单步调试
33 0
|
6月前
|
网络架构
SAP 电商云 Spartacus UI UrlMatcherService 的用法介绍 - External Route 工作的单步调试(一)
SAP 电商云 Spartacus UI UrlMatcherService 的用法介绍 - External Route 工作的单步调试
38 0
|
6月前
|
缓存 Java C++
SAP 电商云 Spartacus UI Angular UI 和 Accelerator JSP UI 的混合使用
Spartacus 在技术和架构( library 发布方式 vs 模板发布方式,headless vs embedded,Angular vs JSP 技术栈)等各方面,都是一种全面的从 Accelerator 的完整范式转变。因此,对于 Commerce Cloud 已经使用 Accelerator 的客户来说,并没有直接的方法可以从基于 Accelerator 的 Storefront 迁移到使用 Spartacus library 的店面。
43 0
|
6月前
关于 SAP 电商云 Spartacus UI Navigation Service 执行的一些明细
关于 SAP 电商云 Spartacus UI Navigation Service 执行的一些明细
46 0