Angular5:动态组件加载 - 具有 @angular/core 依赖项的 StaticInjector 错误

2023-11-22

我正在将一个电子应用程序从 AngularJS 迁移到 Angular5,我在需要加载任意模块及其组件并将主要组件动态渲染到视图的部分遇到问题(它是一个插件系统)。 在我的应用程序中,插件是一个 Angular5 模块,其中包含在我的 Angular5 应用程序中呈现的组件。

我像这样动态加载组件:

@ViewChild("view", { read: ViewContainerRef })
view: ViewContainerRef;

constructor(
  // ...
  private compiler: Compiler,
  private injector: Injector,
  private moduleRef: NgModuleRef<any>
) {}

then,

const addonModule = addonObject.getModule();
this.compiler
  .compileModuleAndAllComponentsAsync(addonModule)
  .then(factories => {
    const factory = factories.componentFactories.find(
      componentFactory =>
        addonObject.getViewComponent().name ==
        componentFactory.componentType.name
    );
    if (factory) {
      const cmpRef = factory.create(this.injector, [], null, this.moduleRef);
      cmpRef.instance.config = {
        from: "[email protected]",
        apikey: "dsfkjd"
      };
      this.view.insert(cmpRef.hostView);
    }
  });

它工作得很好,但是当我在模板中添加材质组件时,它失败了factory.create()出现此错误:

模板:

<div>
    <button mat-button>test</button>
</div>

error:

ERROR Error: Uncaught (in promise): Error: StaticInjectorError[Renderer2]: 
  StaticInjectorError[Renderer2]: 
    NullInjectorError: No provider for Renderer2!

or

模板:

<div fxLayout="row" fxFlex>
    test
</div>

error:

ERROR Error: Uncaught (in promise): Error: StaticInjectorError[MediaMonitor]: 
  StaticInjectorError[MediaMonitor]: 
    NullInjectorError: No provider for MediaMonitor!

材料模块似乎很好地导入到我的插件模块中,否则如果未加载它,我会有不同的行为:它忽略指令(例如<button mat-button></button>只是一个<button></button>无材料影响且无错误)和材料组件抛出错误(例如<mat-card>test<mat-card> throws Error: Template parse errors: 'mat-card' is not a known element...)

我尝试以多种不同的方式捆绑动态模块:tsc / ngc / ng-packagr / webpack。

当我在另一个使用 ng-cli 构建的应用程序的 NgModule 中正常(静态)导入该包时,该包正在工作。

有人知道如何动态渲染在模板中使用材质组件/指令的组件,例如 fxFlex / mat-button / mat-card 吗?

编辑:我在这里用 SystemJS 复制了该错误:https://github.com/thyb/repro-dynamic-loading

角度:5.0.2

角材料:5.0.0-rc1


正如@yurzui 在评论中解释的那样,@angular/* 依赖项被加载了两次。作为解决方法,我发现使其工作的唯一方法是使用window在应用程序和插件之间共享@Angular对象(@angular/core, @angular/common, @angular/material).

在我的应用程序index.html中:

window.angular = {
    core: require("@angular/core"),
    common: require("@angular/common"),
    material: require("@angular/material"),
    ...
}

在我的插件中:

const NgModule = (window as any).angular.core.NgModule;
const CommonModule = (window as any).angular.common.CommonModule;
const MatButtonModule = (window as any).angular.material.MatButtonModule;
...

它并不是很优雅(再见树摇动)但至少它有效......如果有人有一个更简单的解决方案,我会接受:)

我在 Gitter 上看到了关于@角度/元素这看起来很有希望,因为它创建了独立/自包含的 Web 组件,可以动态注入,而不会遇到我遇到的问题 -。这是一个实验室项目,因此在当前版本中不可用,但已经有一些工作要做:https://github.com/angular/angular/pull/19469

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular5:动态组件加载 - 具有 @angular/core 依赖项的 StaticInjector 错误 的相关文章

随机推荐

  • 表格列的对齐方式

    我正在尝试将表放在表内 这意味着嵌套表 现在它看起来像这样截屏 但我需要从左对齐 因为我在每行中使用相同的计数列 您可以看到我为获得此输出所做的尝试 提前致谢 report table border collapse collapse wi
  • reinterpret_cast 到函数指针

    这是我为实验编写的代码reinterpret cast
  • 如何在横向模式和纵向模式之间使用 2 种不同的背景

    我有一个 Android 应用程序 我想知道是否可以为横向和纵向模式提供 1 个布局 1 个布局 xml 文件 但我想要每种模式都有不同的背景 那可能吗 我需要 2 个 xml 文件指向不同的背景图像吗 或者我可以使用 1 个 xml 文件
  • iPad Safari IOS 5 window.close() 关闭错误的窗口

    我们有一个 iPad 应用程序可以在我们的旧款 iPad 上运行 我们使用以下方式打开外部链接 var x window open url 一天结束时 当用户关闭应用程序的这一部分时 我们会检查它打开的所有窗口 并对每个窗口执行 x clo
  • 计算 Postgres 中最近的工作日

    我需要根据订单请求的交货日期在 postgres 查询中安排一些项目 例如 订单要求在星期一交货 例如 20120319 并且订单需要在前一个工作日 20120316 准备 想到最直接的方法 我愿意添加日期表 我认为必须有一种比使用一长串
  • R 中的 ImageMagick

    我想在 R 中使用 ImageMagick 但 R 不允许我安装它 install packages ImageMagick Installing package into C Users FSFH 2 Documents R win li
  • Raku 在编译时执行哪些类型检查?未来这种情况会改变吗?

    目前 截至 2020 年 8 月 Rakudo 不会在编译时对函数的返回值进行类型检查 也就是说 它不提供函数满足其返回约束的静态保证 具体来说 以下两个函数都编译为 Raku sub get int gt Int bug sub get
  • 如何对 UTF-8 字符串数组进行排序?

    我目前不知道如何在 PHP 中对包含 UTF 8 编码字符串的数组进行排序 该数组来自 LDAP 服务器 因此通过数据库排序 没问题 不是解决方案 以下内容在我的 Windows 开发机器上不起作用 尽管我认为这至少应该是一个可能的解决方案
  • StretchBlt HALFTONE == BILINEAR 是否适用于所有缩放?

    谁能澄清一下 GDI 是否拉伸Blt工作站 Win32 API 的函数执行双线性插值以缩放both24 32 位彩色图像的更大和更小图像 如果没有 是否有 GDI notGDI 函数执行此操作吗 The 设置拉伸Blt模式fn 有一个设置H
  • 使用iOS13无法读取电子护照的NFC芯片

    import UIKit import CoreNFC class ViewController UIViewController NFCTagReaderSessionDelegate var nfcTagReaderSession NF
  • FileSystemWatcher 和 Windows 7

    我正在编写一个监视网络目录的工具 该工具在 Windows Server 2008 计算机上运行 任何不使用 Windows 7 的计算机都可以从放置在网络驱动器上的文件正确触发 FileSystemWatcher 的 OnChanged
  • 调整 SKLabelNode 字体大小以适应?

    我正在精灵套件内创建一个标签并设置初始大小 由于该应用程序需要本地化 因此其他语言中的单词可能会比英语版本更长 因此 如何调整标签的字体大小以适应一定的宽度 在本例中是按钮 myLabel SKLabelNode fontNamed Ari
  • IndexError:索引 10000 超出大小为 10000 的轴 0 的范围

    为了获得物理学位 我必须学习一些 Python 课程 我是一个绝对的初学者 因此 我无法理解其他答案 该代码是绘制物体在空气阻力下的轨迹 我真的很感激一个快速修复 我认为这与时间变量太小有关 但增加它并没有帮助 import matplot
  • 如何仅针对 json 关闭 Rails Protect_from_forgery 过滤器

    我有使用 Rails3 构建的网站 现在我想实现 json API 以用于移动客户端访问 但是 由于 protected from forgery 过滤器 从客户端发送 json post 请求 因为客户端不会从服务器检索任何数据 所以客户
  • NSPredicate predicateWithFormat:(NSString*) 不一致?

    在根据用户输入过滤 NSMutableDictionary 时 我创建了以下代码 NSString predicateString NSString stringWithFormat SELF beginsWith cd searchStr
  • pyenv 全局解释器无法在 Windows 10 上运行

    我刚刚按照安装指南安装了 pyenvpyenv win 事情进展顺利 但我无法将 pyenv 全局 python 作为全局解释器 I have rehashed安装后使用pyenv rehash PS D gt pyenv versions
  • 防止特定绘图条目显示在 MATLAB 绘图图例上

    我需要防止特定的绘图条目显示在 Matlab 绘图图例上 Sample x and y are any plot data for i 1 5 plot x y plot x2 y2 PleaseNoLegend I need to hid
  • 二进制文件电子邮件附件问题

    使用 Python 3 1 2 我在发送二进制附件文件 jpeg pdf 等 时遇到问题 MIMEText 附件工作正常 有问题的代码如下 for file in self attachments part MIMEBase applica
  • 为什么 L 是引用类型的前缀(而不是其他字母)? [复制]

    这个问题在这里已经有答案了 Why was L选择作为类型签名中引用的前缀 做L代表某事 例如B代表byte and I代表int 或者是因为C已经被分配给char 例如 System out println new String 0 ge
  • Angular5:动态组件加载 - 具有 @angular/core 依赖项的 StaticInjector 错误

    我正在将一个电子应用程序从 AngularJS 迁移到 Angular5 我在需要加载任意模块及其组件并将主要组件动态渲染到视图的部分遇到问题 它是一个插件系统 在我的应用程序中 插件是一个 Angular5 模块 其中包含在我的 Angu