Angular 为动态创建的外部+;AOT编译组件

Angular 为动态创建的外部+;AOT编译组件,angular,Angular,我们正在开发一个小部件风格的系统,其中,使用Angular 8(无常春藤),我们希望提供AOT编译的组件,这些组件通过SystemJS加载,然后呈现。对于这一点,我们基本上遵循。构建、绑定、导入和渲染组件都可以正常工作 但是,我现在想为正在创建的组件提供一个自定义喷油器。在我看来,这应该很容易 const injector = Injector.create({ parent: this.injector, providers: [ { provide: MY_T

我们正在开发一个小部件风格的系统,其中,使用Angular 8(无常春藤),我们希望提供AOT编译的组件,这些组件通过SystemJS加载,然后呈现。对于这一点,我们基本上遵循。构建、绑定、导入和渲染组件都可以正常工作

但是,我现在想为正在创建的组件提供一个自定义喷油器。在我看来,这应该很容易

const injector = Injector.create({
    parent: this.injector,
    providers: [
        { provide: MY_TOKEN, useValue: 42 },
    ],
});

const compRef = this.container.createComponent(compFactory, 0, injector);

// Both of these work
console.log(injector.get(MY_TOKEN)); // 42
console.log(compRef.injector.get(MY_TOKEN)); // 42
但是,如果我们更改插件以注入此令牌:

constructor(@Inject(MY_TOKEN) private value: number) {}
…我们刚刚收到一个错误,因为找不到令牌:

错误NullInjectorError:StaticInjectorError(…)[o->InjectionToken MY_TOKEN]


AOT编译的组件是否有某些特定的东西阻止它工作?检查捆绑包时,所有内容看起来都与我预期的一样,注入令牌中没有名称损坏的问题或类似的问题


如何正确地为来自外部资源的组件提供自定义注入器?

在Angular中为提供程序使用令牌时,主要的警告是,我们在提供程序中声明并在类中注入的令牌必须从同一物理位置导入。一个例外是字符串标记

这意味着如果您有
const MY_TOKEN=new InjectionToken('MY TOKEN')
在一个js文件中,并且在另一个文件中具有相同的定义,那么如果提供并注入不同的令牌,您可能会遇到这个问题


因此,您的解决方案是使用字符串作为令牌或使用捆绑包之间共享的令牌

您可以尝试使用
字符串
作为令牌吗<代码>{provide:'MY_TOKEN',useValue:42},然后
构造函数(@Inject('MY_TOKEN')私有值:number)
@yurzui字符串作为标记似乎确实有效。知道这是为什么吗?如果有办法使用合适的代币?@yurzui现在我们可以做
导出我的代币:InjectionToken=“MY_TOKEN”作为任何代币
从使用方面隐藏了黑客攻击,但如果能正确地解决这个问题,那将是一件好事。它不适用于propert令牌,因为您的令牌来自不同的物理位置,并且角度使用
instanceof
来检查令牌您可以使用模块之间共享的令牌