angular - ng:错误:尝试将上下文传递到 ComponentPortal 时无法解析组件的所有参数
问题描述
尝试使用自定义注入令牌将上下文传递到 ComponentPortal 并且它可以工作,但是 build --prod 会导致:
错误:无法解析 TooltipComponent 的所有参数
如果我将 InjectionToken 导出到生成门户的服务中,则会出现错误,但我有循环依赖服务 -> 组件 -> 服务
服务:
import {
ApplicationRef, ComponentFactoryResolver, Injectable,
InjectionToken, Injector
} from '@angular/core';
import {
BasePortalOutlet, ComponentPortal, DomPortalOutlet,
PortalInjector, PortalOutlet
} from '@angular/cdk/portal';
import { TooltipComponent } from './tooltip.component';
import TooltipDataInjector from './TooltipInjector';
@Injectable({
providedIn: 'root'
})
export class TooltipService {
private _tooltipPortal: ComponentPortal;
private _bodyPortalHost: DomPortalOutlet;
constructor(
private _factoryResolver: ComponentFactoryResolver,
private _appRef: ApplicationRef,
private _injector: Injector,
) {
this._tooltipPortal = new ComponentPortal(
TooltipComponent,
undefined,
this.createInjector({})
);
this._bodyPortalHost = new DomPortalOutlet(
document.body,
this._factoryResolver,
this._appRef,
this._injector
);
}
createInjector(data): PortalInjector {
const tokens = new WeakMap([
[TooltipDataInjector, data]
]);
return new PortalInjector(this._injector, tokens);
}
show() {
if (this._bodyPortalHost.hasAttached()) {
this._bodyPortalHost.detach();
}
this._bodyPortalHost.attach(this._tooltipPortal);
}
hide() {
this._bodyPortalHost.detach();
}
}
零件:
import { Component, Inject, OnInit, Optional } from '@angular/core';
import TooltipDataInjector from './TooltipInjector';
@Component({
selector: 'app-tooltip',
templateUrl: './tooltip.component.html',
styleUrls: ['./tooltip.component.scss']
})
export class TooltipComponent implements OnInit {
constructor(@Optional() @Inject(TooltipDataInjector) public data: any) {
console.log(data);
}
ngOnInit() { }
}
TooltipInjector.ts:
import { InjectionToken } from '@angular/core';
export const TooltipDataInjector = new InjectionToken<any>('TooltipDataInjector');
export default TooltipDataInjector;
我怎样才能避免这些错误?JIT 编译器正常构建
解决方案
推荐阅读
- javascript - Vuetify - 如何使 v-data-table 的标题动态化
- python - 为什么我的异常消息不会随着我的 if 语句而改变
- firebase - GCP 项目所有权 - 错误失去所有权
- nlp - 在 nltk 语言模型中定义和使用新的平滑方法
- nagios - check_logfiles - 如何使用随机目录检查日志文件
- sql - 购买了 2 件商品的顾客
- javascript - 使用 MDBModal 时如何删除按钮的默认“CLICK”名称?
- alexa - 关于 Amazon Alexa 的“下一个意图”的一般问题(使用技能包)
- mysql - 如何以 Node JS 作为后端将 Mysql 数据获取并显示到 ReactJS 前端?
- glib - 是否可以使用 Emscripten 编译 GLib(然后编译 Autotrace)?