hybris - 新的自定义段落组件中的 Spartacus 编译错误
问题描述
编译新的自定义段落组件时出现以下错误
** src/app/custom-page/new-para/new-para.component.html:7:12 中的错误 - 错误 TS2769:没有与此调用匹配的重载。最后一个重载给出了以下错误。“CmsComponentData”类型的参数不能分配给“Promise”类型的参数。“CmsComponentData”类型缺少“Promise”类型的以下属性:然后,catch,[Symbol.toStringTag],最后
7 <p *ngIf="(cmsComponent | async)?.data as data" [innerHTML]="data.content">
~~~~~~~~~src/app/custom-page/new-para/new-para.component.ts:8:16 8 templateUrl: './new-para.component.html', ~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~ 组件NewParaComponent的模板出错。
**
使用的文件:
"new-para.component.ts"
import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';
import { Observable } from 'rxjs';
import { PromotionResult, CmsService, CmsParagraphComponent } from '@spartacus/core';
import { PromotionService, CmsComponentData } from '@spartacus/storefront';
@Component({
selector: 'app-new-para',
templateUrl: './new-para.component.html',
styleUrls: ['./new-para.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class NewParaComponent {
cartPromotion$: Observable<PromotionResult[]> = this.promotionService.getOrderPromotionsFromCart();
cmsComponent: CmsParagraphComponent;
constructor(protected promotionService: PromotionService,
public component: CmsComponentData<CmsParagraphComponent>,
public cmsService: CmsService) { }
}
"new-para.component.html"
<p *ngIf="(cmsComponent | async) as data" [innerHTML]="data.name"></p>
"custom-page.module.ts"
ConfigModule.withConfig({
cmsComponents: {
CMSParagraphComponent: {
component: NewParaComponent,
}
}
尝试两个选项后出现新的控制台错误:
core.js:6228 ERROR Error: Uncaught (in promise): NullInjectorError: R3InjectorError(AppModule)[CmsComponentData -> CmsComponentData -> CmsComponentData]:
NullInjectorError: No provider for CmsComponentData!
NullInjectorError: R3InjectorError(AppModule)[CmsComponentData -> CmsComponentData -> CmsComponentData]:
NullInjectorError: No provider for CmsComponentData!
at NullInjector.get (core.js:1085)
at R3Injector.get (core.js:16955)
at R3Injector.get (core.js:16955)
at R3Injector.get (core.js:16955)
at NgModuleRef$1.get (core.js:36329)
at Object.get (core.js:33972)
at getOrCreateInjectable (core.js:5848)
at Module.ɵɵdirectiveInject (core.js:21103)
at NodeInjectorFactory.NewParaComponent_Factory [as factory] (new-para.component.ts:12)
解决方案
感谢您发布代码片段,这很有帮助。根据错误,代码似乎缺少一些点点滴滴,但我明白了。
这是你应该做的:
选项1
- 将
component
构造函数参数设为私有或受保护,因为您不在模板中使用它 - 将
data$
属性从分配component.data$
给 属性cmsComponent
。您可以在创建属性时或在 het oninit 生命周期挂钩期间直接执行此操作 - 观察 data$ 属性
component$: Observable<CmsParagraphComponent> = this.component.data$;
constructor(protected component: CmsComponentData<CmsParagraphComponent>) { }
<p *ngIf="(component$ | async) as data" [innerHTML]="data.name"></p>
选项 2
- 直接在html中使用公共服务
- 绑定到
data$
服务的属性
constructor(public component: CmsComponentData<CmsParagraphComponent>) { }
<p *ngIf="(component.data$ | async) as data" [innerHTML]="data.name"></p>
虽然选项 2 更短,但我更喜欢选项 1。它可以更好地扩展,以防您需要对数据流进行操作并将其他流混合在一起。
推荐阅读
- c - 来自 epoll_wait 的 epoll 事件顺序
- javascript - 如何使用 javascript 显示或隐藏基于文本框输入的面板?
- html - 使用登录在网站后面卷曲 HTML 内容(手稿状态跟踪)
- javascript - 正则表达式:忽略转义项(Javascript)
- javascript - Stackoverflow 如何防止页面加载之间的“白闪”?
- c# - ASP.NET MVC:CS1061 错误
- sql - 避免当前筛选器的 Tableau 参考线
- php - 如何动态调用危险的 PHP 函数来开发概念验证?
- php - 在请求之间保留查询字符串 Laravel
- user-interface - 如何使用画布分析球拍 gui 代码