Angular Elements - 未捕获类型错误:无法构造“HTMLElement”

2024-02-25

我一直在尝试让 Angular 元素组件正常工作,因为我正在考虑在即将到来的项目中使用它们。

我已经遵循了许多教程(都非常相似),但无法让它们工作。其中一个教程是this one https://www.techiediaries.com/angular-elements-web-components/.

我有 Elements 项目的以下 package.json

        {
      "name": "angular-webcomponents-demo",
      "version": "0.0.0",
      "scripts": {
        "ng": "ng",
        "start": "ng serve",
        "build": "ng build",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e",
        "build:elements": "ng build --prod --output-hashing none && node build-script.js"
      },
      "private": true,
      "dependencies": {
        "@angular/animations": "~7.2.0",
        "@angular/common": "~7.2.0",
        "@angular/compiler": "~7.2.0",
        "@angular/core": "~7.2.0",
        "@angular/elements": "^7.2.15",
        "@angular/forms": "~7.2.0",
        "@angular/platform-browser": "~7.2.0",
        "@angular/platform-browser-dynamic": "~7.2.0",
        "@angular/router": "~7.2.0",
        "core-js": "^2.5.4",
        "rxjs": "~6.3.3",
        "tslib": "^1.9.0",
        "zone.js": "~0.8.26",
        "document-register-element": "^1.7.2"
      },
      "devDependencies": {
        "@angular-devkit/build-angular": "~0.13.0",
        "@angular/cli": "~7.3.8",
        "@angular/compiler-cli": "~7.2.0",
        "@angular/language-service": "~7.2.0",
        "@types/jasmine": "~2.8.8",
        "@types/jasminewd2": "~2.0.3",
        "@types/node": "~8.9.4",
        "codelyzer": "~4.5.0",
        "concat": "^1.0.3",
        "fs-extra": "^8.1.0",
        "jasmine-core": "~2.99.1",
        "jasmine-spec-reporter": "~4.2.1",
        "karma": "~4.0.0",
        "karma-chrome-launcher": "~2.2.0",
        "karma-coverage-istanbul-reporter": "~2.0.1",
        "karma-jasmine": "~1.1.2",
        "karma-jasmine-html-reporter": "^0.2.2",
        "protractor": "~5.4.0",
        "ts-node": "~7.0.0",
        "tslint": "~5.11.0",
        "typescript": "~3.2.2"
      }
    }

我构建使用npm un build:elements按照指示,然后尝试以最简单的 html 形式托管

ie

<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="analytics-counter.js"></script>
</head>

<body>
  <analytics-counter></analytics-counter>
</body>
</html>

最初我遇到了类似的错误这个帖子 https://stackoverflow.com/questions/53441437/the-selector-app-root-did-not-match-any-elements-angular-6(除了我提到的custom-root而不是“应用程序根”。

我已经从引导程序中删除了该组件,所以我现在有以下内容app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { Injector } from '@angular/core';
import { createCustomElement } from '@angular/elements';
import { AppComponent } from './app.component';
import { AnalyticsCounterComponent } from './analytics-counter/analytics-counter.component';

@NgModule({
  declarations: [
    AppComponent,
    AnalyticsCounterComponent
  ],
  imports: [
    BrowserModule
  ],
  entryComponents: [
    AnalyticsCounterComponent
  ],
  providers: []  
})
export class AppModule {
  constructor(private injector: Injector) {     
  }
  ngDoBootstrap() {    
    const el = createCustomElement(AnalyticsCounterComponent, { injector: this.injector });
    customElements.define('analytics-counter', el);
  }
}

我删除了<custom-root>从index.html以及我在其他地方看到的建议

我现在得到的错误是

Uncaught TypeError: Failed to construct 'HTMLElement': Please use the 'new' operator, this DOM object constructor cannot be called as a function.
        at t [as constructor] (analytics-counter.js:4)
        at new t (analytics-counter.js:4)
        at CustomElementRegistry.e.<computed> [as define] (analytics-counter.js:2)
        at new e (analytics-counter.js:4)
        at analytics-counter.js:4
        at Mo (analytics-counter.js:4)
        at analytics-counter.js:4
        at new e (analytics-counter.js:4)
        at Object.ti [as createNgModuleRef] (analytics-counter.js:4)
        at t.create (analytics-counter.js:4)

这些教程和解释看起来都非常简单,但我无法让最基本的示例起作用。

这里可能出了什么问题?


我能够重现您的错误。问题来自于build-script.js。您必须修改它并确保它只能编译es2015.js文件而不是es5.js。 ES5 在使用本机自定义元素时遇到一些问题,因此您必须使用 ES2015。

所以它看起来像这样:

const files = [
  './dist/CustomElements/runtime-es2015.js',
  './dist/CustomElements/polyfills-es2015.js',
  './dist/CustomElements/main-es2015.js'
];

另请随意检查我的 Angular Elements 工作演示存储库 -角度自定义元素 https://github.com/dinohorvat/angular-custom-elements。输出已经在elements/文件夹,这样你就可以运行index.html在那里进行测试。我能够通过在这个项目的构建脚本中将 es2015 替换为 es5 来重现该错误。

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

Angular Elements - 未捕获类型错误:无法构造“HTMLElement” 的相关文章

随机推荐

  • C# 如何对内存对象执行实时 xslt 转换?

    我有一个函数需要 2 个参数 1 XML 文件 2 XSLT 文件 然后执行转换并返回生成的 HTML 这是函数
  • Pandas:如果有任何值小于先前的值,如何检查多列?

    这里已经提供了单列的解决方案 Pandas 检查列值是否小于任何先前的列值 https stackoverflow com questions 53737715 pandas check if column value is smaller
  • 如何模拟鼠标点击?

    我想知道如何使用 VB NET 创建一种自动点击器 我基本上会预先定义点击坐标 并且点击 我想这些点击必须被延迟分开 因为我希望定期发生不止一次点击 会发生在应用程序窗口之外 我读到这涉及额外的系统挂钩 我能够找到的唯一代码与应用程序窗口上
  • FCM 安全警报

    安全警报 您的应用包含公开的 Google Cloud Platform GCP API 密钥 请看这个Google 帮助中心文章 https support google com faqs answer 9287711了解详情 我在 Go
  • Java:从方法调用返回两个整数

    我在处理大量二维坐标的代码中经常这样做 int getSize int res gridRows gridColumns return res 我知道我可以定义一个小类并获得类型安全 但我没有这样做 因为在它自己的小琐碎 java 文件中拥
  • C 多个单行声明

    当我在一行上声明多个变量时会发生什么 例如 int x y z 全部都是整数 问题是下面语句中的 y 和 z 是什么 int x y z 都是int指针吗 Only x是一个指向 int 的指针 y and z是常规整数 这是 C 声明语法
  • 停止系统中的所有参与者而不关闭系统本身?

    在Akka 2 0中 有没有一个好的方法来关闭 user路径下的所有actor 例如 假设我执行以下操作 val system ActorSystem create mySystem system actorOf Props new MyA
  • 对 UIView 的 CoreGraphics/drawRect 内容进行动画处理

    是否可以制作动画UIView的 CoreGraphics 内容 说我有一个UIView子类称为MyView实现了drawRect 像这样的方法 void drawRect CGRect rect CGContextRef c UIGraph
  • 如何将 Google 图表集成为 AngularJs 指令?

    有一些将 Google 图表集成为 AngularJs 指令的示例 像这个 http plnkr co edit YzwjuU p preview http plnkr co edit YzwjuU p preview Update 我想避
  • 为什么我的代码没有向标准输出打印任何内容? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试计算学生的平均分 impo
  • 如何获取角度形式数组中更改项目的索引

    我正在使用带有反应形式的 Angular 4 我有一个表单数组 我试图将其绑定到我在组件中跟踪的数组 我使用反应式表单 这样我就可以进行验证 所以我不想使用模板表单方法 我将项目添加到表单数组中 如下所示 createFormWithMod
  • 有没有办法用静态 OpenSSL 构建静态 Qt?

    原始问题略有不同 但属于更主要问题的一部分 我正在尝试在 Windows 上使用静态 OpenSSL 将 Qt 5 2 构建为静态 我的最终目标是发送单个二进制文件无需提供 libeay32 dll 和 ssleay32 dll 然而 在我
  • 角度异步等待中的单元测试位置

    我使用 Angular 9 与 karma 测试运行器和 jasmine 测试框架进行单元测试 我只想进行单元测试app component其中有一个依赖注入 app component ts import Component Embedd
  • HTML5 Canvas - 用图像填充圆圈

    如何在圆内绘制图像 如果我做 context beginPath context arc e pageX e pageY 161 0 Math PI 2 true context closePath 然后我如何使用 fill 用我绘制的图像
  • 为组合 ggplots 添加通用图例

    我有两个水平对齐的 ggplotsgrid arrange 我浏览了很多论坛帖子 但我尝试的所有命令似乎现在都已更新并命名为其他名称 我的数据如下所示 Data plot 1 axis1 axis2 group1 0 212201 0 35
  • Django:找出菜单中已选择的项目

    我确信我以前在 Stack Overflow 上见过这个问题 但我找不到它 所以这里什么也没有 我有一个普通的 Django 菜单 它使用 url 菜单项的标签和静态名称 现在我想为已选择的菜单项设置不同的样式 但是菜单是在基本模板中渲染的
  • Objective-C HashMap 等效项

    我正在尝试转换一段使用 HashMap 的 Java 代码 其中包含一个对象作为键 一个对象包含一个值 private static HashMap
  • zfcuser 注册后添加用户角色

    我使用 Zend Framework 2 以及 ZfcUser BjyAuthorize 和 Doctrine 作为数据库 到目前为止 注册等工作进展顺利 我的问题是 注册用户没有分配角色 所以我想在注册过程中向用户添加角色 用户 我想我可
  • 如何在 Windows 上禁用调试断言对话框?

    我有一堆以批处理模式运行的单元测试 有时 Visual C 库发出的调试断言会导致崩溃 这会弹出一个对话框 并且单元测试停止运行 直到我单击 确定 关闭对话框 如何让 C 程序在遇到断言时崩溃 就像在 Linux 上一样 而不是弹出烦人的对
  • Angular Elements - 未捕获类型错误:无法构造“HTMLElement”

    我一直在尝试让 Angular 元素组件正常工作 因为我正在考虑在即将到来的项目中使用它们 我已经遵循了许多教程 都非常相似 但无法让它们工作 其中一个教程是this one https www techiediaries com angu