javascript - Angular2 - 依赖注入(inject)在注入(inject)循环引用的动态组件时不起作用

标签 javascript angularjs angular

我有一种情况,根据选择的输入(单选框或复选框),我通过 ajax 动态添加一个组件。

Plunkr:https://plnkr.co/edit/uvGo3RxCkUPeuknVu9m8?p=preview

为了更好地理解,我解释一下流程:

第一层:src/parent/parent.ts

我们从 questions.json 获取 json 响应并填充问题。

基于controlType我们加载 a-componentb-componentsrc/parent/parent.html .

当我在 a-component 中选中一个复选框时或 b-component 中的单选按钮,我调用createDynamicComponent()并传入 componentData .

componentData只是根据所选选项需要填充的下一个组件的元数据信息。

现在,componentData被传递到 dynamic-component来自 src/controls/a.htmlsrc/controls/b.html

内部dynamic-component ,我解析提供者并注入(inject) questions数据进入 entryComponents,(a-componentb-component)

一切正常,直到我引入一个 HService (包含组件数据构建逻辑)在 a-component 中和 b-component .

我收到以下错误,Error: Can't resolve all parameters for BComponent: ([object Object], [object Object], ?)

最后一个参数是 HServiceb-component 的构造函数中,如果我取出服务并使用注释代码,一切正常。

this.componentData = {
  'questions': {
    "question": "This is a " + this.level + " level question?",
    "controlType": "radio",
    "answers": [
        "Yes",
        "No",
        "None"
    ]
  },
  "component": BComponent,
  "level": this.level
};

编辑 1: 我有 HService注入(inject) a-component已经并且没有提供者解决错误并且工作正常。仅将其添加到 b-component ,我遇到了错误。

帮助将不胜感激!!

最佳答案

我认为问题是基于循环依赖。

A <=> HServiceB <=> HService

为了解决这个问题,我将通过为 HService 创建抽象类来释放依赖性并将其用作 token :

base.h.ts

export abstract class BaseHService {
    private componentData: any;

    abstract getComponentData(queries: IQ[], level: number): any;
}

app.module.ts

providers: [ 
  { provide: BaseHService, useClass: HService }, <== this line
  { provide: 'questions', useValue: {} }, 
  { provide: 'level', useValue: 1 }
],

a.ts

import { BaseHService } from "../h/base.h";
...
constructor(...private _h: BaseHService) {

b.ts

import { BaseHService } from "../h/base.h";
...
constructor(...private _h: BaseHService) {

Modified Plunker

关于javascript - Angular2 - 依赖注入(inject)在注入(inject)循环引用的动态组件时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43198098/

相关文章:

angular - 使用 Angular SPA MSAL 库在 Azure B2C 上执行用户流

javascript - 将通过 GitHub Api 收到的 gpg_keys 转换为装甲

javascript - 显示表中的隐藏行

Javascript/Jquery 从 &lt;input&gt; 和 <datalist> 转到 URL

angularjs - 使用 Angularjs 的 CRUD ng-grid 示例

javascript - angularjs 不加载部分

javascript - 使用 ng-if 短暂呈现然后消失的内容

javascript - 简单 jQuery 选项卡的问题

angular - ngClass 未在 Angular 2+ 中更新

angular - agm-map 不是已知元素 angular 4