SpartacusSmartEdit中是否支持自定义AbstractCMSComponentContainer?

如何解决SpartacusSmartEdit中是否支持自定义AbstractCMSComponentContainer?

我在后端具有以下数据模型:

AccordionComponentContainer extends CMSTabParagraphContainer
AccordionItemComponent extends SimpleCMSComponent

扩展CMSTabParagraphContainer的容器,因为扩展了 AbstractCMSComponentContainer在屁股上很痛苦(生成的jalo类具有 进行调整,但这对这种情况并不重要,仅对于 理解。

现在我在Spartacus CmsAccordionComponent中拥有一个组件。我介绍了 组件映射:

AccordionComponentContainer: { 
  component: CmsAccordionComponent,},

在我的组件html文件中,我有类似以下内容

<h2>{{headline$ | async}}</h2> 
<ul> 
  <ng-container *ngFor="let component of components$ | async; let i = index"> 
    <li>{{component.content}}</li>
  </ng-container> 
</ul>

我在 projects/storefrontlib/src/cms-components/content/tab-paragraph-container为 我的实现参考(例如组件实现)。期望使用ng-template(cxOutlet):

<ng-template [cxOutlet]="component.flexType" [cxOutletContext]="{}">
  <ng-container [cxComponentWrapper]="component"></ng-container> 
</ng-template>

之前,我尝试过与CMSTabParagraphContainer相同的解决方案。由于某种原因,这在我的项目中不起作用。我引入了一个自己的组件和一个用于子代的映射(AccordionItemComponent),但是它不起作用。子组件未显示

因此,我使用了上述解决方案。使用我的解决方案,将显示组件(以及子组件),但是我无法在SmartEdit中对其进行编辑。也许与以下问题有关:https://github.com/SAP/spartacus/issues/1484

出于测试目的,我添加了“普通” CMSTabParagraphContainer CMSParagraphComponent到后台的我的内容位置。我可以编辑 SmartEdit中显示的第一个CMSParagraphComponent。不幸的是,我 无法将新段落添加到CMSTabParagraphContainer。所以我想 ng-template(cxOutlet)解决方案是比我更好的解决方案。

能否请您说明TabParagraphContainerComponent和代码段的方式 ng-template(cxOutlet)有效吗?我也认为这应该在 github发行票据(https://github.com/SAP/spartacus/issues/1484),以便 更好地支持CMSTabParagraphContainer(AbstractCMSComponentContainer) 在Spartacus(SmartEdit)中。

感谢您的帮助!

解决方法

最重要的是cxComponentWrapper。该指令获取组件插槽数据并在内部渲染组件。

cxComponentWrapper要求每个组件具有以下数据集:

{
  flexType: item.typeCode,typeCode: item.typeCode,uid: item?.uid
}

典型的容器组件模板实现将遍历各个组件并应用指令:

<ng-container *ngFor="let item of items$ | async">
  <ng-container
    [cxComponentWrapper]="{
      flexType: item.typeCode,uid: item?.uid
    }"
  >
  </ng-container>
</ng-container>

您可能会遇到的问题是容器组件cms数据中缺少组件type。 cms api将仅公开各种嵌套组件的组件UID。您需要使用CmsService.getComponentData从后端获取组件类型。您需要为每个组件uid执行此操作。如果您循环执行此操作,则Spartacus实际上将合并对CmsService.getComponentData的各种调用,并对后端进行单个调用。

可以在https://github.com/SAP/spartacus/blob/746a15c1b63998065b0ceea96f4da052829533fb/projects/storefrontlib/src/cms-components/content/banner-carousel/banner-carousel.component.ts#L25找到这种实现的示例。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?