代码之家  ›  专栏  ›  技术社区  ›  Stefan Zvonar

在Angular6中生成服务时,与可注入装饰器一起提供的目的是什么?

  •  57
  • Stefan Zvonar  · 技术社区  · 6 年前

    在angular cli中生成服务时,它将添加额外的元数据,该元数据的“provided in”属性默认为可注入装饰器的“root”。

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

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

    更新:

    对于其他人,下面的段落也提供了另一个很好的解释,特别是如果您只想向功能模块提供服务。

    现在有一种新的、推荐的、直接注册提供者的方法 里面 @Injectable() 装饰工,使用新的 providedIn 属性。它接受 'root' 作为 申请。当你使用 “根” 你的 injectable 将 在应用程序中注册为Singleton,您不需要 将其添加到根模块的提供程序。同样,如果你使用 providedIn: UsersModule , the 可注射的 注册为 提供方 UsersModule 不添加到 providers 属于 模块。”。- https://blog.ninja-squad.com/2018/05/04/what-is-new-angular-6/

    更新2:

    经过进一步调查,我决定只有 providedIn: 'root'

    如果你想的话 provide 除了根模块之外的任何模块中的服务,那么最好使用 提供者 在功能模块的decorators中设置数组,否则您将受到循环依赖的困扰。在这里进行有趣的讨论- https://github.com/angular/angular-cli/issues/10170

    5 回复  |  直到 5 年前
        1
  •  30
  •   Sajeetharan    6 年前

    如果使用providedin,则可注入文件将注册为模块的提供程序,而不将其添加到模块的提供程序中。

    Docs

    服务本身是一个由cli生成的类, 用@可注射的装饰。默认情况下,此装饰器配置为 具有providedIn属性,该属性为服务创建提供程序。 在这种情况下,providedIn:“root”指定服务应该 在根注入器中提供。

        2
  •  18
  •   Mick    6 年前

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

    1. 该服务将作为一个单例在应用程序范围内可用,无需将其添加到模块的提供者数组(如angular<=5)。
    2. 如果该服务仅在延迟加载的模块中使用,则它将与该模块一起延迟加载
    3. 如果它从未被使用过,它将不会包含在构建中(树抖动)。

    有关更多信息,请考虑阅读 documentation NgModule FAQs

    顺便说一句:

    1. 如果不希望应用程序范围的单例使用提供程序的组件数组。
    2. 如果您希望限制范围,以便没有其他开发人员会在特定模块之外使用您的服务,请改用提供程序的ngmodule数组。
        3
  •  5
  •   Jawad Farooqi    6 年前

    Providedin告诉Angular根注入器负责创建服务的实例。以这种方式提供的服务会自动提供给整个应用程序,不需要在任何模块中列出。

    服务类可以充当它们自己的提供者,这就是为什么在@injectable decorator中定义它们是您所需要的全部注册。

        4
  •  4
  •   Nipuna    5 年前

    来自DOCS

    什么是可注射装饰剂?

    将类标记为可供Injector创建。

    import { Injectable } from '@angular/core';
    
    @Injectable({
      providedIn: 'root',
    })
    export class UserService {
    }
    

    服务本身是一个由cli生成的类,用@injectable()修饰。

    providedin到底做什么?

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

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

    providedin:'根'

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

    提供:模块

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

    import { Injectable } from '@angular/core';
    import { UserModule } from './user.module';
    
    @Injectable({
      providedIn: UserModule,
    })
    export class UserService {
    }
    

    这种方法是首选的,因为它可以使树摇动( 树木抖动 是构建过程中的一个步骤,如果没有注入,则从服务的代码基中移除未使用的代码。

    如果无法在服务中指定哪个模块应提供服务,也可以在模块中声明服务的提供程序:

    import { NgModule } from '@angular/core';
    import { UserService } from './user.service';
    
    @NgModule({
      providers: [UserService],
    })
    export class UserModule {
    }
    
        5
  •  2
  •   Maarti    6 年前

    根据 Documentation :

    在@injectable()元数据中注册提供程序还允许 通过从编译的 如果不使用的话。

    推荐文章