【问题标题】:Angular allow inheritance service declaration in constructorAngular 允许在构造函数中声明继承服务
【发布时间】:2018-08-01 21:39:02
【问题描述】:

我有一个组件 HomeComponent,我有两个服务:AnimalService 和 DogService

DogService 像这样扩展 AnimalService :

@Injectable({providedIn: 'root'})
export class AnimalService {
    constructor() {}
    move(): any {
        console.log('move animal');
    }
}

@Injectable({providedIn: 'root'})
export class DogService extends AnimalService {
    constructor() {
        super();
    }
    scream(): any {
        console.log('il crie');
    }
}

然后我想通过在我的组件中调用尖叫函数来使用它:

    @Component({
        selector: 'jhi-home',
        templateUrl: './home.component.html',
        styleUrls: ['home.scss']
    })
    export class HomeComponent implements OnInit {

        constructor(private dogService: DogService) {}

        ngOnInit() {
            this.dogService.scream(); // the error here : scream is not a function
        }
    }

但我有以下错误:

this.dogService.scream is not a function

也许有角度的微妙之处,因为 Injectable 或类似的东西,我知道 DogService 的构造函数没有被调用,因为我的网络浏览器知道它是一个 AnimalService。如果我执行 dogService = New DogService 而不是在构造函数中声明它,情况并非如此。但我不明白为什么。

有什么想法吗?

【问题讨论】:

  • 您是否尝试在 module 而不是 providedIn 标志中注册您的服务?

标签: javascript angular typescript inheritance angular-services


【解决方案1】:

问题是您的超类中的注释。不要注释 AnimalService。它必须是一个抽象的简单类。

export abstract class AnimalService {
    constructor() {}
    move(): any {
        console.log('move animal');
    }
}

@Injectable({providedIn: 'root'})
export class DogService extends AnimalService {
    constructor() {
        super();
    }
    scream(): any {
        console.log('il crie');
    }
}

【讨论】:

  • 我认为 OP 的意图是也能够单独使用超类。如果它没有注释,那么它就不能用作服务。如果这是不可能的,也许他/她需要重新考虑设计。
  • 我同意。我打算展示的是,服务之间的继承只有在只有一个 class 获得 Injectable 注释并且这必须是继承类时才有效。
  • 在这种情况下,使AnimalService 成为一个抽象类(没有@Injectable),并创建一个单独的AnimalService 实现(使用@Injectable)。这样DogService 仍然可以扩展抽象,并且可以创建一个单独的可注入实例
  • @Lynx 感谢您的回答。是的,我想继续使用 AnimalService。所以最后我做了以下事情:我在抽象类AbstractAnimalService 中复制了AnimalService,并在上面扩展了DogService。这样,我可以继续使用 AnimalService,如果我想使用 DogService 的所有功能(在抽象类和 DogService 本身中实现)。不要犹豫,告诉我这是否是一个好习惯!
  • 很高兴听到它对您有用。 :-) 是的,您使用 AnimalService 和 DogService 使用的抽象类的方法是一个很好的方法。做得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2018-06-06
相关资源
最近更新 更多