【问题标题】:Dynamically creating components - "ng build --prod" throws an error during package creation动态创建组件——“ng build --prod”在创建包时抛出错误
【发布时间】:2019-05-22 11:56:37
【问题描述】:

我正在构建一个 Angular 7 应用程序,并在运行时根据数据类型动态创建组件(表单控件)。

以下是我的 dynamic-loading-component.ts 文件的摘录

this.componentRef.instance.form = this.form;
const dynamicComponent = this.componentRef.instance;

我正在将一些函数绑定到这个动态组件,如下所示:

dynamicComponent.onKeyUp = function (value) {
            self.onValueChangeOfControl(dynamicComponent, value);
        };

在其中一种控件类型中,例如在 number.component.html 文件中,我有以下代码

<input type='number' [value]="metadata.Value" [name]="metadata.Name" [id]="metadata.Name"
  (keyup)="onKeyUp($event.target.value)">

每当keyupevent 发生时,它都会正确调用全局分配的dynamicComponent.onKeyUp 函数,并且在本地一切正常。

但是,当我使用 ng build --prod 构建它时,它给了我以下错误 - number\number.component.html(2,3): : Property 'onKeyUp' does not exist on type 'NumberComponent'.

Angular 期望在我的 number.components.ts 文件中定义 onKeyUp() 但是,我在上面有这个绑定到动态组件。我不想在每个控件组件文件中为此类事件编写重复的代码。

有哪些方法可以解决这个问题? ng build 工作正常,但我需要 ng build --prod 才能获得优化的部署位。

想法?

【问题讨论】:

  • 请张贴代码而不是图片。为什么在模板文件中使用onKeyUp 而不是(keyUp) eventemitter?如果你有它在一个父组件中,你有没有设置它以便NumberComponents 扩展它?
  • 这不是父子关系案例。我正在尝试根据控件的数据类型动态构建表单。 (keyup) 事件绑定在单独的控件模板中,正如您在我的帖子中看到的那样。我无法粘贴完整的代码,因为这只是整个应用程序的一小部分。您可以参考我用来创建这些动态组件的方法的几个链接。例如netbasal.com/…
  • 我不是在谈论父/子结构,我指的是您的组件类。 “上面的动态组件”是什么意思,目前还不清楚。我经常使用动态组件创建,但从来没有遇到过这个问题。该错误清楚地说明了Property 'onKeyUp' does not exist on type 'NumberComponent',所以这就是您应该查看的内容。组件是否具有该属性?

标签: angular angular-cli angular-forms angular-aot


【解决方案1】:

您是否尝试过在定义模块的entryComponents 部分指定动态组件? 参考What is the difference between declarations and entryComponents

来自Angular docs

[...] 如果您的应用碰巧通过以下方式引导或动态加载组件 键入命令,您必须将其显式添加到 entryComponents。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2020-04-17
    • 2019-04-06
    • 1970-01-01
    • 2022-08-03
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多