angular - 在 Angular 2 的构造函数中声明服务实例

标签 angular typescript

我是 Angular 2 和 Typescript 的新手,正在尝试了解 DI。在我看到的所有代码中,我看到引用服务的变量被键入到构造函数中。这是为什么?为什么我们不能在构造函数外而是在类内声明它呢?

考虑以下英雄之旅中的代码,例如在 Angular 网站上:

import { Component, OnInit } from '@angular/core';
import { Hero } from './hero';
import { HeroService } from './hero.service';

@Component({
    moduleId: module.id,
    selector: 'my-dashboard',
    templateUrl: `dashboard.component.html`,
    styleUrls: ['dashboard.component.css']
})
export class DashboardComponent implements OnInit {

    heroes: Hero[] = [];

    constructor(private heroService: HeroService) { }

    ngOnInit(): void {
        this.heroService.getHeroes()
            .then(heroes => this.heroes = heroes.slice(1, 5));
    }
}

如果我像下面这样在构造函数外声明 heroService,应用程序会抛出很多错误。

export class DashboardComponent implements OnInit {

    heroes: Hero[] = [];

    constructor() { }

    private heroService: HeroService;

    ngOnInit(): void {
        this.heroService.getHeroes()
            .then(heroes => this.heroes = heroes.slice(1, 5));
    }
}

据我了解,在构造函数之外编写它不会生成服务类 HeroService 的实例,但为什么呢? (它是 Angular 的东西还是 TypeScript?)在这个例子中,Hero 也是一个类(虽然不是服务类,但在技术上仍然是一个类!),我们已经声明了 heroes: Hero[] = []; 在构造函数之外,并且有效。

最佳答案

Angular DI 检查构造函数参数,当 Angular DI 创建类(服务、组件、指令、管道)的新实例时,它会查找匹配的提供程序以传递给构造函数。

因此,

  • 注入(inject)仅适用于 DI 实例化的类

  • 只考虑构造函数参数进行注入(inject)

关于angular - 在 Angular 2 的构造函数中声明服务实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41715269/

相关文章:

angular - 将输入值传递给对话框组件

javascript - 如何以 Angular 访问组件类中的可观察对象值?

typescript - 如何找到 @types/node 变更日志?

typescript - 接口(interface)在 Typescript 中有用吗(从架构上来说)?

Angular/RxJS : nested service calls with observables

angular - 如何使用 jest 框架模拟异步函数?

javascript - 从 URL/查询字符串预加载 Angular 组件

django - 使用 docker 设置 django 和 angular

angular - 在 Angular 6 组件中声明模型错误

java - 在 Angular + Spring Security 应用程序中找不到错误