Spartacus (SmartEdit) 是否支持自定义 AbstractCMSComponentContainer?
Is there any support of custom AbstractCMSComponentContainer in Spartacus (SmartEdit)?
我在后端有以下数据模型:
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.
出于测试目的,我添加了 'normal' CMSTabParagraphContainer
CMSParagraphComponent 到我在后台的内容插槽。我可以编辑
SmartEdit 中显示的第一个 CMSParagraphComponent。不幸的是,我
无法将新段落添加到 CMSTabParagraphContainer。因此我认为
ng-template (cxOutlet) 解决方案是我的更好的解决方案。
能否解释一下 TabParagraphContainerComponent 和代码片段
ng 模板(cxOutlet)有效吗?我也认为这应该在
github 开票 (https://github.com/SAP/spartacus/issues/1484) 以便
更好地支持 CMSTabParagraphContainer (AbstractCMSComponentContainer)
在斯巴达克斯 (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,
typeCode: item.typeCode,
uid: item?.uid
}"
>
</ng-container>
</ng-container>
您可能会遇到的问题是容器组件 cms 数据中缺少组件 type
。 cms api 只会公开各种嵌套组件的组件 UID。您需要使用 CmsService.getComponentData
从后端获取组件类型。您需要为每个组件 uid 执行此操作。如果您在循环中执行此操作,Spartacus 实际上会合并对 CmsService.getComponentData 的各种调用,并对后端执行单个调用。
中找到此类实现的示例
我在后端有以下数据模型:
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.
出于测试目的,我添加了 'normal' CMSTabParagraphContainer CMSParagraphComponent 到我在后台的内容插槽。我可以编辑 SmartEdit 中显示的第一个 CMSParagraphComponent。不幸的是,我 无法将新段落添加到 CMSTabParagraphContainer。因此我认为 ng-template (cxOutlet) 解决方案是我的更好的解决方案。
能否解释一下 TabParagraphContainerComponent 和代码片段 ng 模板(cxOutlet)有效吗?我也认为这应该在 github 开票 (https://github.com/SAP/spartacus/issues/1484) 以便 更好地支持 CMSTabParagraphContainer (AbstractCMSComponentContainer) 在斯巴达克斯 (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,
typeCode: item.typeCode,
uid: item?.uid
}"
>
</ng-container>
</ng-container>
您可能会遇到的问题是容器组件 cms 数据中缺少组件 type
。 cms api 只会公开各种嵌套组件的组件 UID。您需要使用 CmsService.getComponentData
从后端获取组件类型。您需要为每个组件 uid 执行此操作。如果您在循环中执行此操作,Spartacus 实际上会合并对 CmsService.getComponentData 的各种调用,并对后端执行单个调用。