在Angular2中,使用继承还是注入依赖?

Posted

技术标签:

【中文标题】在Angular2中,使用继承还是注入依赖?【英文标题】:In Angular2, use inheritance or inject dependency? 【发布时间】:2016-06-03 05:54:34 【问题描述】:

在 angular2 中,假设我有一个 Parent 类和一个 Child1 类,它们具有相同的属性/成员和方法。如何初始化Child1类?

服务

@Injectable()
export class Parent   
    constructor(
        private currentImg: string,
        private catImg: string,
        private dogImg: string,
        private enable: boolean) 
    

    onMouseOver() 
        enable = true;
        currentImg = catImg;
    

    onMouseClick() 
        enable = false;
        currentImg = dogImg;
    


其中一个子类想要扩展Parent类:

import Parent from "./Parent";

@Component(
    selector: 'app',
    templateUrl: 'app/child.html',
    providers: [Parent]
)

export class Child1 

     private currentImg: string = "img/dog.png",
     private catImg: string = "img/cat.png",
     private dogImg: string = "img/dog.png",
     private enable: false

    constructor(private _parent: Parent) 
    

    onMouseOver() 
        this._parent.onMouseOver();
    

    onMouseClick() 
        this._parent.onMouseClick();
    

【问题讨论】:

如何初始化?要将Parent的同名属性设置为Child1 是的,Parent 和 Child 具有相同的属性名称。此时调用 Child1 类的函数,例如 onMouseOver() this._parent.onMouseOver(); ,它只改变 currentImg 的值和 Parent Properties 的 enable。但我想更改 Child 类的那些属性值。你知道我该怎么做吗? 你想要没有继承(Child1 extends Parent 子句)?还是你不知道? 你可以inject non-classes values进入构造函数,但是通过provider来定义每一个有点烦人。 我不知道如何在 anuglar2 中使用继承。在 Java 中,我们可以使用扩展。但是在这里,我被告知使用注入依赖来实现继承。我很困惑我该怎么做。根据我的示例,您知道必须在 angular2 中使用继承吗? 【参考方案1】:

当你扩展一个类时,主类可以使用基类的方法和属性。

export class Base   
    private image: string = "img/dog.png"; // default image
    // you don't need catImg and dogImg here...
    // private catImg: string;
    // private dogImg: string;
    private currentImg: string;
    private enable: boolean;

    constructor()  

    onMouseOver(image) 
        enable = true;
        currentImg = image;
    

    onMouseClick(image) 
        enable = false;
        currentImg = image;
    


当您想在主类中设置属性时,您不要在基类中初始化/设置它们的值。 您只需要在Base 类中声明您正在使用的那些属性和方法。您可以设置类将共享的公共属性,例如默认的image

这是在两个不同的类中扩展 Base 类的方法:

import Base from "./Base";

@Component(
    selector: 'app',
    template: `<button (click)="onMouseClick(image)">show cat</button>`,
    providers: []
)
export class CatImage extends Base 

    private image: string = "img/cat.png",
    constructor()  
      super();
    


@Component(
    selector: 'app',
    template: `<button (click)="onMouseClick(image)">show dog</button>`,
    providers: []
)
export class DogImage extends Base 

    private image: string = "img/dog.png",
    constructor()  
      super();
    

CatImageDogImage 都将从 Base 类继承 enablecurrentImg 属性、onMouseOver()onMouseClick() 方法,您可以在它们的代码/模板中使用它们...

【讨论】:

非常好的答案。请问我是否有这个文件auth0.service.ts 用于身份验证。我是否像export class CatImage extends Auth0Service ...export class DogImage extends Auth0Service ... 这样使用它,所以我可以使用auth0.service.ts 中的方法,例如.isLoggedIn(); 不,当您想要更改时扩展一个类,或者扩展它的功能(:要使用服务,您可以在构造函数中注入它,请参阅this example... 太棒了!谢谢@Sasxa @Sasxa 你删除了 plunk 代码示例吗?我有一个问题,如果我不想通过 onMouseOver(image) 之类的函数传递参数,因为我有多个参数要传递,我该怎么办?现在,我在子级和父级中都将所有相同的属性声明为 public,这样我就可以编写没有参数 onMouseOver() 的函数,但我知道声明为 public 的属性是非常不安全的。

以上是关于在Angular2中,使用继承还是注入依赖?的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2.3 组件继承和依赖注入

Angular2.3 自定义库和依赖注入

翻译对比Angular1和Angular2中的依赖注入

AngularJS 依赖注入

Angular2开发笔记

Angular 2 - 如何将依赖项注入到自定义类中,该类不是组件并且不作为服务公开