服务和提供者的继承和多态性

时间:2017-02-09 02:51:47

标签: javascript angular typescript

我试图学习Angular2,但遇到了一些麻烦。我有一个名为ParentService

的抽象服务类
export abstract class ParentService {

}

和另一个名为ParentService

ChildService扩展的Service类
export class ChildService extends ParentService {

}

然后我有一个名为input.component

的组件类
import { Component } from "@angular/core";

import { ParentService } from "./service/parent.service";

@Component({
    selector: 'app-input',
    templateUrl: './input.component.html'
})
export class InputComponent {
    constructor(private parentService: ParentService) {}

}

在我的app.component中,我提供了ChildService的实例

import { Component } from '@angular/core';
import { ChildService } from './service/child.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [ChildService]
})
export class AppComponent {

}

然而,这不起作用。它构建良好,但在运行应用程序时我得到了一个 错误:

EXCEPTION: Error in ./AppComponent class AppComponent - inline template:4:16 caused by: No provider for ParentService!

这可能吗?我只希望input.component知道ParentService。我真的不想让它知道实施情况。

2 个答案:

答案 0 :(得分:2)

你不能指望Angular2自动将子类连接到这样的原始类声明。如果您有两个子类DogServiceCatService同时继承AnimalService列表中声明的providers,应该使用哪一个?

相反,您需要明确指定它:

providers: [{provide: ParentService, useClass: ChildService}]

文档:https://angular.io/docs/ts/latest/guide/dependency-injection.html

答案 1 :(得分:2)

这是有可能的,但稍加一点。

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [{provide: ParentService, useClass: ChildService}]
})
export class AppComponent {

}

这里的问题是角度为2的DI不会试图推断出类之间的任何关系。因此,默认情况下,为了注入ParentService,您必须提供ParentService,period。但幸运的是,我们可以使用上面的构造覆盖此行为。它按字面意思告诉DI容器"如果有人要求ParentService,则创建并给他们一个ChildService实例,而不是#34;。