提问者:小点点

当在Angular 6中生成服务时,使用可注入装饰器提供的目的是什么?


当在AngularCLI中生成服务时,它会添加额外的元数据,并提供一个'提供'属性,默认为'root'。

@Injectable({
  providedIn: 'root',
})

ProvidedIn到底是做什么的?我假设这是使整个应用程序的服务像“全局”类型的单例服务一样可用,但是,在AppModule的提供者数组中声明此类服务不是更干净吗?


共3个答案

匿名用户

提供:'root'是自Angular 6以来提供服务的最简单、最有效的方式:

  1. 该服务将作为单例在应用程序范围内可用,无需将其添加到模块的提供者数组(如Angular

如需更多信息,请阅读留档和NgModule常见问题解答

顺便说一句:

  1. 如果您不想要应用程序范围的单例,请改用提供程序的组件数组。
  2. 如果您想限制范围,以便没有其他开发人员在特定模块之外使用您的服务,请改用NgModule的提供程序数组。

匿名用户

从云文档

什么是可注射装饰器?

将类标记为可供Injector创建。

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class UserService {
}

服务本身是一个类,CLI生成并用@Injecttable()修饰。

供应到底是做什么的?

通过将注射器与@NgModule或其他注射器类型相关联,或通过指定应在“根”注射器中提供此注射器来确定哪些注射器将提供可注射器,该注射器将是大多数应用程序中的应用程序级注射器。

providedIn: Type<any> | 'root' | null

提供:“根”

当您在根级别提供服务时,Angular会创建一个共享的服务实例,并将其注入到任何请求它的类中。在@Inject table()元数据中注册提供者还允许Angular通过从编译的应用程序中删除服务来优化应用程序,如果它没有被使用的话。

提供:模块

也可以指定应在特定的@NgModule中提供服务。例如,如果您不希望应用程序可以使用服务,除非它们导入您创建的模块,您可以指定服务应在模块中提供

import { Injectable } from '@angular/core';
import { UserModule } from './user.module';

@Injectable({
  providedIn: UserModule,
})
export class UserService {
}

此方法是首选的,因为如果没有注入任何内容,它会启用服务的Tree摇动(Tree摇动是构建过程中从代码库中删除未使用代码的步骤)。

如果无法在服务中指定哪个模块应该提供它,您还可以在模块中声明服务的提供者:

import { NgModule } from '@angular/core';
import { UserService } from './user.service';

@NgModule({
  providers: [UserService],
})
export class UserModule {
}

匿名用户

如果您使用ProvidedIn,则可注入对象将注册为模块的提供者,而无需将其添加到模块的提供者中。

文档

服务本身是CLI生成的类,并使用@Injecttable进行装饰。默认情况下,此装饰器配置了一个ProvidedIn属性,该属性将为服务创建一个提供者。在这种情况下,ProvidedIn:'root'指定应在根注入器中提供服务。