Angular 角度/离子模块中对ModalController的依赖导致;Can';t解析所有参数“;为服务

Angular 角度/离子模块中对ModalController的依赖导致;Can';t解析所有参数“;为服务,angular,typescript,ionic-framework,dependency-injection,Angular,Typescript,Ionic Framework,Dependency Injection,我正在为Ionic 4.7.0和Angular 5.0.3创建一个动态表单模块。 模块创建DynamicFormComponent,但在内部也使用DynamicFormService。此服务不需要在模块外部提供。该服务依赖于Ionic ModalController来注册模态弹出窗口。此依赖关系导致以下错误: 无法解析DynamicFormComponent(?[object])的所有参数。 如果我从服务中删除ModalController依赖项,错误就会消失,但我需要ModalControll

我正在为Ionic 4.7.0和Angular 5.0.3创建一个动态表单模块。 模块创建DynamicFormComponent,但在内部也使用DynamicFormService。此服务不需要在模块外部提供。该服务依赖于Ionic ModalController来注册模态弹出窗口。此依赖关系导致以下错误:

无法解析DynamicFormComponent(?[object])的所有参数。

如果我从服务中删除ModalController依赖项,错误就会消失,但我需要ModalController在模块的不同组件中创建弹出窗口

我怎样才能解决这个问题

这是我的dynamic-form.module.ts,包含在我的AppModule的导入中:

从'@angular/core'导入{NgModule,ErrorHandler};
从“@angular/common”导入{CommonModule};
从“离子角度”导入{IonicModule,IonicErrorHandler};
从'@angular/forms'导入{ReactiveFormsModule};
从“./fields/stringfield.component”导入{StringFieldComponent};
从“./fields/selectfield.component”导入{SelectFieldComponent};
从“./fields/numberfield.component”导入{NumberFieldComponent};
从“./dynamicform.service”导入{DynamicFormService};
从“./dynamicform.component”导入{DynamicFormComponent};
从“./dynamic field.directive”导入{DynamicFieldDirective};
@NGD模块({
声明:[
StringFieldComponent,
选择FieldComponent,
NumberFieldComponent,
动态场定向,
动态组件,
],
供应商:[
动态服务,
{提供:ErrorHandler,useClass:IonicerHandler}
],
进口:[
公共模块,
离子模块,
反应形式模块,
],
出口:[
动态组件,
],
入口组件:[
StringFieldComponent,
选择FieldComponent,
NumberFieldComponent,
]
})
导出类DynamicFormModule{
}
这是dynamic-form.component.ts的缩写版本,我认为它包含所有相关部分

从'@angular/core'导入{Component,OnInit,Input,Output,EventEmitter};
从'@angular/forms'导入{FormGroup,FormBuilder};
从“./models/form config.interface”导入{FormConfig};
从“./dynamicform.service”导入{DynamicFormService};
@组成部分({
选择器:“动态表单”,
templateUrl:'./dynamic form.component.html',
})
导出类DynamicFormComponent在NIT上实现{
@Input()datasetSchema:object;
@Input()formName:string;
@输出()值已更改:EventEmitter=新的EventEmitter();
有效载荷:字符串;
formGroup:formGroup;
config:FormConfig;
建造师(
公共dfs:DynamicFormService,
私人fb:FormBuilder,
) {
}
恩戈尼尼特(){
this.config=this.dfs.mapJSONSchema(this.datasetSchema)[this.formName];
this.formGroup=this.createFormGroup();
}
onSubmit(){
如果(此.valid){
this.payLoad=JSON.stringify(this.value);
this.valueChanged.emit(this);
log(“Form value”,this.value);
}
}
//……为了简洁起见,有些东西遗漏了
}
以下是DynamicFormService的开始:

import { Injectable } from '@angular/core';
import { Validators } from '@angular/forms';
import 'rxjs/add/operator/map';
import { ModalController } from 'ionic-angular';
import { FormConfig } from './models/form-config.interface';
import { FieldConfig } from './models/field-config.interface';
import { DynamicSubFormComponent } from './dynamic-subform.component';
import { IntegerValidator } from './fields/validators';


@Injectable()
export class DynamicFormService {
  private modals = {};

  constructor(
    public modalCtrl: ModalController
  ) {
    console.log("Started dynamic form service");
  }
  //.... Again stuff left out for brevity's sake.
}
为了安全起见,这是我的app.module.ts

从'@angular/core'导入{NgModule,ErrorHandler};
从“@angular/platform browser”导入{BrowserModule};
从“离子角度”导入{IonicApp,IonicModule,IonicErrorHandler};
从“/app.component”导入{EnviMo};
从“../pages/home/home”导入{HomePage};
从“../pages/list/list”导入{ListPage};
从'@ionic native/status bar'导入{StatusBar};
从'@ionic native/SplashScreen'导入{SplashScreen};
从“../dynamicform/dynamicform.module”导入{DynamicFormModule};
从“../providers/page service/page service”导入{PageService};
从'ng socket io'导入{SocketIoModule,SocketIoConfig};
const-config:SocketIoConfig={url:'http://127.0.0.1:8080,选项:{};
@NGD模块({
声明:[
埃维莫,
主页
列表页,
],
进口:[
浏览器模块,
SocketIoModule.forRoot(配置),
动态模板,
IonicModule.forRoot(EnviMo)
],
引导:[IonicApp],
入口组件:[
埃维莫,
主页
列表页,
],
供应商:[
状态栏,
飞溅屏幕,
{提供:ErrorHandler,useClass:IonicerHandler},
寻呼服务,
]
})
导出类AppModule{
构造函数(){
}
}

答案只是部分答案,因为它需要一些重构。 显然,在服务中使用modalcontroller实际上是不好的,因为服务不是一个组件,因此不是DOM或组件层次结构的一部分,也不是它的正式名称(请纠正我)。另一方面,ModalController取决于组件层次结构,特别是能够将模态添加到根组件的应用程序。如果我理解正确的话,离子魔法会在引导过程中解决这个问题。但是,由于DynamicFormModule中的DynamicFormService是在任何引导发生之前实例化的,因此无法创建该服务。如果它不在子模块中,而是直接在应用程序中,则首先进行引导,然后进行服务实例化。所以在这种情况下没有问题

但是:我的模块中的组件(DynamicFormComponent和其他组件)只有在引导发生后才能创建。所以他们可以使用ModalController。
因此,解决方案是将modalCtrl.create调用移动到组件,而不是将它们放在服务中,并将ModalController注入到这些组件中,而不是服务中。

您的DynamicFormService本身是否有依赖项,例如,它的构造函数中是否有参数?@Ryan抱歉,忘记包含这段代码。它现在在那里。回答:是的,这取决于ionic ModalController确保为ModalController提供了一些