Angular 如何注入服务于某些数据?

Angular 如何注入服务于某些数据?,angular,Angular,我正在使用angular 9,我需要将配置数据注入服务: @Injectable({ providedIn: 'root' }) export class AuthService { private auth: any; constructor(private authConfig: AppConfig) { } } 我需要将AppConfig注入到服务中。我如何才能做到这一点?如果AppConfig是一项服务,您应该以您的方式轻松地将其注入AuthService。否则,如果

我正在使用angular 9,我需要将配置数据注入服务:

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  private auth: any;

  constructor(private authConfig: AppConfig) {
  }
}

我需要将
AppConfig
注入到服务中。
我如何才能做到这一点?

如果
AppConfig
是一项
服务
,您应该以您的方式轻松地将其注入
AuthService
。否则,如果
AppConfig
不是服务,并且Angular无法注入它(因为Angular无法管理它),那么您可能需要将
AppConfig
中的字段设置为静态,或者手动在
AuthConfig
中安装,或者将其设置为单例,甚至可以将其添加到
AppModule
中的providers部分。但是我认为你应该让Angular来管理它,如果它不是一个
服务
,那么把它添加到
提供者
如果
AppConfig
是一个
服务
,你应该用你的方式轻松地将它注入
AuthService
。否则,如果
AppConfig
不是服务,并且Angular无法注入它(因为Angular无法管理它),那么您可能需要将
AppConfig
中的字段设置为静态,或者手动在
AuthConfig
中安装,或者将其设置为单例,甚至可以将其添加到
AppModule
中的providers部分。但我认为你应该让Angular来管理它,如果它不是一项
服务
,请将其添加到
提供商中。使用静态数据

对于简单的基于对象的配置数据`{url:“/login”,…},我建议您使用一个简单的JSON文件。您可以在中阅读如何将JSON文件导入角度项目

2。使用专用的typescript类


要利用typescript的优点,您可以声明一个简单的类文件,并将您的配置收集为静态属性,绑定到类:

export class AppConfig{
  public static xy = "..."
}
然后使用
myVariable=AppConfig.xy
导入它(别忘了导入它)

3。使用environment.ts


这已经在Angular中,您可以使用基于环境的配置,阅读有关
environment.ts
environment.prod.ts
的更多信息。这与第二点非常相似,但是如果运行
ngbuild
ngbuild--prod
,则该文件将替换为不同的文件

4。运行时配置


在理解了前面示例的优缺点之后,您可能会想,我们是否只能在运行时提供配置,可能是基于一些动态规则?是的,这是可能的,但是有点复杂,但是您可以在模块启动之前注入配置,甚至可以通过使用
provide:APP\u INITIALIZER
,从异步调用注入配置。阅读更多关于它的信息。使用静态数据

对于简单的基于对象的配置数据`{url:“/login”,…},我建议您使用一个简单的JSON文件。您可以在中阅读如何将JSON文件导入角度项目

2。使用专用的typescript类


要利用typescript的优点,您可以声明一个简单的类文件,并将您的配置收集为静态属性,绑定到类:

export class AppConfig{
  public static xy = "..."
}
然后使用
myVariable=AppConfig.xy
导入它(别忘了导入它)

3。使用environment.ts


这已经在Angular中,您可以使用基于环境的配置,阅读有关
environment.ts
environment.prod.ts
的更多信息。这与第二点非常相似,但是如果运行
ngbuild
ngbuild--prod
,则该文件将替换为不同的文件

4。运行时配置


在理解了前面示例的优缺点之后,您可能会想,我们是否只能在运行时提供配置,可能是基于一些动态规则?是的,这是可能的,但是有点复杂,但是您可以在模块启动之前注入配置,甚至可以通过使用
provide:APP\u INITIALIZER
,从异步调用注入配置。阅读更多信息

您可以创建一个服务并使用可注入装饰器装饰,然后将provideIn设置为root(这将使服务成为单例)

AppConfig

@可注入({
提供于:“根”
})
导出类AppConfig{
url:string;
港口:编号;
}

然后,您可以将服务注入AppNode并设置属性

。。。
导出类AppModule{
构造函数(config:AppConfig){
config.url='127.0.0.1';
config.port=3000;
}
}

之后,将appConfig注入应用程序中的任何组件和服务

,您只需创建一个服务并使用可注入装饰器进行装饰,然后将provideIn设置为root(这将使服务成为单例)

AppConfig

@可注入({
提供于:“根”
})
导出类AppConfig{
url:string;
港口:编号;
}

然后,您可以将服务注入AppNode并设置属性

。。。
导出类AppModule{
构造函数(config:AppConfig){
config.url='127.0.0.1';
config.port=3000;
}
}

之后,将appConfig注入到应用程序中的任何组件和服务中,一个选项是使用静态json文件


  • 在应用程序的
    src/assets/
    文件夹中创建一个
    config.json
    文件,其中包含您的配置
  • 使用HTTP检索服务中的配置
  • auth.service.ts

    从'@angular/core'导入{Injectable};
    从'@angular/common/http'导入{HttpClient};
    @可注射()
    导出类身份验证服务{
    构造函数(专用http:HttpClient){
    this.http.get('/assets/config.json').subscribe(数据=>{
    控制台日志(数据);
    });
    }
    }
    

    工作示例:

    一个选项是使用静态json文件

  • 创建
    config.json
    文件c
    export const environment = {
      production: true
    };
    
    import {AppConfig} from '../app/models/app-config';
    
    export const environment = {
      production: false,
      authConfig: {
        clientID: 'oidc-client',
        // stuff or other
      } as AppConfig
    };
    
    import {Injectable} from '@angular/core';
    import {environment} from '../../environments/environment';
    
    @Injectable({
      providedIn: 'root'
    })
    export class AuthService {
    
      private authConfig = environment.authConfig;
    
      constructor() {
      }
    }