Angular包组件中的继承

时间:2019-06-07 11:07:14

标签: angular typescript

我正在编写Angular软件包,其中将提供基本功能,并允许用户根据需要扩展它以进行自定义。基本组件包括一些我将在内部使用的服务。因此,当我在应用程序中扩展此组件时,会出错,因为它需要使用内部使用的服务作为参数的super()调用。

我在Angular GitHub存储库上检查了此问题(https://github.com/angular/angular/issues/5155),该问题建议使用'Injector'将服务注入基本组件,但这似乎不是正确的方法。对于这种情况是否有更好的结构。

基本组件

    Component({
        selector: 'base-comp',
        template: `
            <p>
                base-comp works
            </p>
        `,
        styles: []
    })
    export class BaseComp implements OnInit {
        constructor(private someservice: SomeService,
            private anotherService: AnotherService
          ) {
        }
    }

子组件

    @Component({
        selector: 'app-root',
        templateUrl: './app.component.html',
        styleUrls: ['./app.component.css']
    })
    export class AppComponent extends BaseComp {
        constructor(private localService: LocalService) {
          super(); // this gives error
        }
    }

我希望子组件继承而不在构造函数的super()调用中传递所有依赖项。

1 个答案:

答案 0 :(得分:0)

  

我希望子组件继承而不传递所有依赖项   在super()构造函数中调用

Tl;博士,你不能。

如果最高层组件继承自DI,则消费者需要向下传播此DI。

如果您使用服务而非继承(即favour composition over inheritance),则可以实现您的功能而不会遇到依赖问题。

您还可以为依赖项实现factory pattern(再次作为服务),那么您只需要一次注入,而无需多次注入。