美文网首页
SAP 电商云 Spartacus UI BaseSiteIni

SAP 电商云 Spartacus UI BaseSiteIni

作者: _扫地僧_ | 来源:发表于2022-07-12 11:58 被阅读0次

    services

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

    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 方法:


    subscribe 最终导致 setDefaultFromConfig 被调用:

    此时 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 三个参数。

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

    onRead

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

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

    总结

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

    相关文章

      网友评论

          本文标题:SAP 电商云 Spartacus UI BaseSiteIni

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