Angular 角度2的注射。它是如何工作的?
我已经学了几天了。当我阅读Angular 2中的Injectable()概念并尝试在以下链接中应用教程的示例代码时,我遇到了一个问题 他们说我需要将注释@Injectable()放在类的顶部,以便其他类可以进行注入,如:Angular 角度2的注射。它是如何工作的?,angular,dependency-injection,Angular,Dependency Injection,我已经学了几天了。当我阅读Angular 2中的Injectable()概念并尝试在以下链接中应用教程的示例代码时,我遇到了一个问题 他们说我需要将注释@Injectable()放在类的顶部,以便其他类可以进行注入,如: import { Injectable } from '@angular/core'; @Injectable() export class appService { getApp(): string { return "Hello wo
import {
Injectable
} from '@angular/core';
@Injectable()
export class appService {
getApp(): string {
return "Hello world";
}
}
问题是,当我删除Injectable()时,我的应用程序仍能正常运行。
有人能帮我弄清楚Angular 2中的注入是如何工作的吗?如文档中所述: 碰巧,您可以从
HeroService
的第一个版本中省略@Injectable()
,因为它没有注入参数。但现在您必须拥有它,因为服务具有注入依赖项。您需要它,因为Angular需要构造函数参数元数据才能插入记录器
简言之,如果您的注射剂有注射剂,@Injectable
装饰器解决了循环依赖。
“Angular 2中的注入是如何工作的?”
这是一个非常广泛的问题,但总而言之,角度注入系统创建该提供者对象/函数的实例,并在将其注入构造函数时在该组件中使用该实例
如果您没有在正在使用的组件中提供它,那么它将转到它的父组件,直到它找到实例为止,直到它被使用的模块。每个级别都有自己的提供者实例映射,组件将使用它向上遍历注入树时找到的第一个实例
因此,提供程序在定义之前将是一个单例实例。编写应用程序时,必须采取3个步骤才能执行注入:
1.创建服务类。
2.声明接收组件的依赖项。
3.配置注入(在NgModule
中用角度输入注册注入)
该服务将被称为可注入服务,因为它表示组件将通过注入接收的内容
@Injectable()
export class MyService {
getData(): void {
console.log('Fetching data');
}
}
现在您已经有了要注入的东西,下一步是声明在angular创建组件时要接收的依赖项。
在angular中执行此操作的一种方法是在组件的构造函数中声明所需的可注入项:
export class MyApp {
constructor(private myService: MyService) {}
}
在组件构造函数中声明注入时,angular将进行一些反射,以确定要注入的类。换句话说,angular将看到我们正在构造函数中寻找MyService类型的对象,并检查依赖项注入系统是否有适当的注入。
使用依赖项注入的最后一步是连接我们的组件希望从注入项注入的内容。这意味着,当组件声明其依赖项时,我们需要告诉angular要注入什么东西。
为此,我们将MyService添加到我们的NgModule
的提供者密钥中
@NgModule({
declarations: [ MyApp ],
imports: [ BrowserModule ],
providers: [ MyService ]
})
实际上,只有当您的服务具有依赖性时,才需要注释。但始终将其添加到服务中是一种良好的做法。这是有记录的:,关于你的第二个问题,“Angular 2中的注入是如何工作的”,阅读文档可能有助于理解这一点。我们不会在这里为您重写它。很好的解释,+1:)解释得很好的答案,+1这在文档中已经没有了。不确定是否仍然是这样。