当前位置: 首页 > Web前端 > HTML

关于Angular注解@Injectable()用法的一些误解

时间:2023-04-02 20:01:30 HTML

一个常见的误解是@Injectable()是我们计划在应用程序中注入组件/服务的任何类的必需装饰器。这种说法并不完全正确。当使用Angular装饰器时,被装饰的类以Angular可以读取的格式存储关于自身的元数据——这包括关于它需要获取和注入哪些依赖项的元数据。如果一个类没有使用Angular装饰器,那么Angular就无法读取它需要的依赖项。这就是我们需要使用@Injectable()的原因。如果我们的服务注入提供者,我们必须添加@Injectable(),这个注解除了告诉Angular存储它需要的元数据之外没有实现任何额外的功能。假设我们有以下服务类:exportclassUserService{isAuthenticated():boolean{returntrue;}}对于上面的类,我们不需要用@Injectable修饰它就可以将它注入到组件中。因为UserService本身并没有注入任何提供者。但是,如果我们的服务类本身注入了其他依赖项:import{Http}from'@angular/http';exportclassUserService{constructor(privatehttp:Http){}isAuthenticated():Observable{returnthis.http.get('/api/user').map((res)=>res.json());上面的代码将无法工作,因为Http提供者元数据不会被Angular存储以进行适当的组合。解决方案是使用@Injectable注解:import{Injectable}from'@angular/core';从'@angular/http'导入{Http};@Injectable()exportclassUserService{constructor(privatehttp:Http){}isAuthenticated():Observable{returnthis.http.get('/api/user').map((res)=>res.JSON());}}SAPSpartacus示例:对于用于DI反转(IOC)容器的控件,开发人员通常需要完成两个设置。首先是令牌。要向IOC容器注册依赖项,需要提供令牌。令牌是用于注册任何服务的唯一标识符。第二件事是配置提供者本身。提供程序帮助DI容器创建特定依赖项的运行时实例。在Angular中,使用令牌注册服务并将其传递给提供者的具体方式如下:首先,可以使用特定的@NgModule注册服务。该过程是通过向服务传递一组提供者来注册服务。下面是一个示例,使用的令牌是打字稿类型MyService。这里的提供者是useClass。该提供者策略通知AngularDI框架可以通过new关键字实例化依赖项。示例代码:@NgModule({...providers:[//简写语法{provide:MyService,useClass:MyService},//简写语法MyService],})注意上面提供了两种语法,因为provide和useClass指向的类型定义相同,所以可以直接简写为MyService。