【问题标题】:angular2 extend service with argument in constructorangular2在构造函数中使用参数扩展服务
【发布时间】:2016-12-15 15:15:17
【问题描述】:

我在理解如何在 angular2 中正确扩展服务时遇到一些问题,可能是因为我不太了解如何在 typescript 中扩展类。

超类

@Injectable()
export class CallService{
    constructor(private errror:string){
        this.errMsg=errror;
    }
    private _errMsg:string;
    set errMsg(arg0:string){
        this._errMsg=arg0;
    }
    get errMsg():string{
        return this._errMsg;
    }
}

子类

@Injectable()
export class DownloadService extends CallService{
    constructor(private error:string,private http:Http){
        super(error)
    }
}

App.Component

@Component({
selector:'my-app',
    templateUrl:'app/app.component.html',
    styleUrls:['app/app.component.css'],
    directives:[ROUTER_DIRECTIVES,WaitComponent],
    providers:[DownloadService,SwitcherService,CallService,WaitService]
})
export class AppComponent{
    title:'App'
    constructor(
        private areadownloadservice:AreaDownloadService,
        private waitService:WaitService,
        private switcherservice:SwitcherService,
        private callService:CallService){}
    )
}

我想做的是用 CallService 扩展一些类,这样所有调用的类都会有一个 errMsg 字符串属性来设置或获取,但我得到了这个异常:

没有字符串的提供者!

我错过了什么?

【问题讨论】:

  • 问题不是子类。构造函数中的string类型注解使得注入器去寻找string提供者,并且没有,并且组件中也没有为error定义提供者。
  • 好的,按照我上面写的方式扩展服务的正确方法是什么?
  • 你希望 Angular DI 向error 参数传递什么?

标签: angular types angular2-services


【解决方案1】:

你可以

  • 去掉error参数

  • 使error 参数可选

export class CallService{
    constructor(@Optional() private errror:string){

...

export class DownloadService extends CallService{
    constructor(@Optional() private error:string,private http:Http){
  • 或者告诉 DI 它应该通过什么
bootstrap(AppComponent, [HTTP_PROVIDERS, {provide: 'someToken', useValue: 'someStringValue'}])
export class CallService{
    constructor(@Inject('someToken') private errror:string){

...

export class DownloadService extends CallService{
    constructor(@Inject('someToken') private error:string,private http:Http){

您也可以使用 OpaqueToken 代替字符串键 ('someToken')。
另见http://blog.thoughtram.io/angular/2016/05/23/opaque-tokens-in-angular-2.html

【讨论】:

    【解决方案2】:

    在这行代码constructor(private error:string,private http:Http){,您告诉构造函数实际准备Httpstring 服务,但您没有在任何地方声明这样的string 服务。

    【讨论】:

    • 这也是一个很好的答案,它很好地解释了错误,但是Gunter写了一个更完整的解决方案
    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多