繁体   English   中英

如何将参数传递给Ionic2 / Angular2中的提供者构造函数?

[英]How can I pass an argument to a provider constructor in Ionic2 / Angular2?

我试图将我的Ionic2.beta11应用程序移植到新的Ionic2.rc0版本。 大多数事情都非常简单,但我对AoT编译器有疑问。

我有一个AuthService:

@Injectable()
export class AuthService {
  constructor(@Inject(Http) http: Http) {
    this.http = http;
  }
  ...
}

我在src/app/app.module.ts文件src/app/app.module.ts它注入我的应用src/app/app.module.ts

@NgModule({
  declarations: [
    MyApp,
    ...
  ],
  imports: [
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    ...
  ],
  providers: [
    AuthService
  ]
})

运行离子服务时一切正常,但是当我尝试构建它时,我收到以下错误:

ngc error: Error: Error at .../.tmp/app/app.module.ngfactory.ts:397:78: Supplied parameters do not match any signature of call target.

396 - 399行:

get _AuthService_74():import44.AuthService {
  if ((this.__AuthService_74 == (null as any))) { (this.__AuthService_74 = new import44.AuthService()); }
  return this.__AuthService_74;
}

问题是new import44.AuthService()需要一个类型为http的参数。

有趣的是,当我在定义文件中用constructor()手动替换constructor(http: Http)时,一切正常。

我阅读了所有可以找到的StackOverflow答案,但没有一个解决方案解决了我的问题。

我是否需要更改AuthService中的构造函数或将其注入我的应用程序的方式? 谢谢您的帮助。

您必须改变方式,如何定义提供者:

@NgModule({
  ...
  providers: [
    Http,
    {
      provide: AuthService,
      useFactory: getAuthService,
      deps: [Http]
    }
  ]
})

最后一块是工厂功能:

export function getAuthService(http: Http): LoggingService {
  return new AuthService(http);
}

另请参见迁移到Ionic 2 RC 0 - ngc失败

我遇到了同样的问题,Markus让我走上了正轨,但这就是我需要做的事情(参见Angular docs Dependency Injection )下的“Factory Providers”:

使注入的服务中的构造函数参数可选。 仅此一点是不够的(http在运行时未定义)

constructor(public http?: Http){}

创建服务提供者类SomeServiceProvider.ts:

import { Http } from '@angular/http';
import { SomeService } from 'some-service';

export function someServiceFactory(http: Http){
  return new SomeService(http);
}

export let SomeServiceProvider =
  { provide: SomeService,
    useFactory: someServiceFactory,
    deps: [ Http ]
  };

在根app.component.ts中,添加服务提供者:

@Component({
  ...
  providers: [ SomeServiceProvider ]
})

从app.module.ts中的@NgModule提供程序中删除该服务。

要在组件中使用该服务,请从Injector获取它而不是注入服务:

import { Component, Injector } from '@angular/core';
import { SomeService } from 'some-service';

@Component({
  ...
})

export class MyComponent{
  someService: SomeService = this.injector.get(SomeService);

  constructor(private injector: Injector) {}

}

在app模块中从@angular/http导入HttpModule ,如下所示:

import { HttpModule } from '@angular/http';
@NgModule({
  declarations: [
    MyApp,
    ...
  ],
  imports: [
    HttpModule,
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    ...
  ],
  providers: [
    AuthService
  ]
})

如下更改您的服务并检查一次:

import { Http } from '@angular/http';
@Injectable()
export class AuthService {
  constructor(private http: Http) {
  }
  ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM