如何添加我的自定义页面解析器而不是Spartacus页面解析器?

时间:2019-09-03 14:58:49

标签: spartacus-storefront

我正在将我的解析器(从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');
    });
  }
}

1 个答案:

答案 0 :(得分:1)

TL; DR

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


详细说明

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

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

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

specificity of all Page Meta Resolvers

您需要通过定义元解析器的属性this.pageTemplate = '<name-of-page-template-used-only-at-homepage>'来指定更多内容。这样,您每次访问首页时,您的HomePageMetaResolver的得分就会比默认ContentPageMetaResolver高。

自定义评分算法

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