首页 > 解决方案 > 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 编译器正常构建

标签: angularangular-cdk

解决方案


推荐阅读