首页 > 解决方案 > 如何添加我的自定义页面解析器而不是 Spartacus 页面解析器?

问题描述

我正在将我的解析器(从 PageMetaResolver 扩展)添加到我自己的 home.module 中的提供程序中。但是,我的方法'resolve'没有被调用。你有什么想法吗?

@Injectable({
  providedIn: 'root'
})
export class HomePageMetaResolver extends PageMetaResolver implements PageDescriptionResolver {

  constructor(
    protected routingService: RoutingService,
    protected translationService: TranslationService,
    protected cms: CmsService
  ) {
    super();
    this.pageType = PageType.CONTENT_PAGE;
  }

  resolve(): Observable<PageMeta> {
    console.log('RESOLVE')

    return this.cms.getCurrentPage().pipe(
      switchMap(page =>
        combineLatest([
          this.resolveDescription()
        ])
      ),
      map(([description]) => ({ description }))
    );
  }

  resolveDescription(): Observable<string> {
    return new Observable(sub => {
      sub.next('test description');
    });
  }
}

标签: spartacus-storefront

解决方案


TL;博士

请指定不仅this.pageType,而且this.pageTemplate为您的PageMetaResolver


详细解释

最具体的页面元解析器获胜

从您的元解析器的名称猜测,您只想为您的主页提供自定义元。请注意,由于简单的评分算法,最具体的元解析器获胜,该算法考虑了 2 个因素:页面类型页面模板(参见源https://github.com/SAP/cloud-commerce-spartacus-storefront/blob /develop/projects/core/src/cms/page/page-meta.resolver.ts#L11)。

目前,您的解析器HomePageMetaResolver与通用解析器具有相同的特异性,因此resolve不会调用您的方法。

所有页面元解析器的特殊性

您需要通过定义其属性来指定更多元解析器this.pageTemplate = '<name-of-page-template-used-only-at-homepage>'。然后,每当您访问主页时,您HomePageMetaResolver将获得比默认值更高的分数。ContentPageMetaResolver

自定义评分算法

对于自定义评分算法(例如可以考虑pageId),您可以覆盖getScorePageMetaResolver的 s. 您甚至可以扩展该方法PageMetaService.getMetaResolver以重新定义选择正确页面元解析器的所有规则。但是对于您的情况,标准解决方案(如上所述)就足够了。


推荐阅读