Angular 2 将一个类注入到服务中

Posted

技术标签:

【中文标题】Angular 2 将一个类注入到服务中【英文标题】:Angular 2 inject a class into a service 【发布时间】:2017-05-11 02:45:25 【问题描述】:

我想用我的配置参数在我的服务中注入一个类。

我做了下面的示例代码,但它不起作用:

import  Config  from '../app.constants';

console.log(Config); // here i can access to my properties of config

@Injectable()
export class MyService 


  protected config: Config;

  constructor(protected _http: Http, @Inject(Config) _configuration: Config) 
    console.log(this.config); // undefined
    console.log(_configuration); // undefined

我想我没有理解 Angular 2 的作用域和注入过程。 如何在我的服务 MyService 中访问我的类配置?

编辑:

这是我的模块

import  NgModule       from '@angular/core';

import  MyService  from './my.service';
import  Config  from '../app.constants';


@NgModule(
  imports: [
  ],
  declarations: [
    MyService
  ],
  exports: [
    MyService
  ],
  providers: [
    MyService,
    Config
  ]
)
export default class MyModule 

这是我的配置:

import  Injectable  from '@angular/core';

@Injectable()
export class Config 
  public Port: number = 1234;
  public Server: string = "http://my-server.com";

服务MyService没有被直接调用,我是这样扩展的:

@Injectable() 导出类 TestService 扩展 MyService ...

这样导入的:

import  TestService  from '../service/test.service';
//some modules are from ng2-admin, we can ignore them
@NgModule(
  imports: [
    CommonModule,
    NgaModule,
    TestRouting
  ],
  declarations: [
    TestComponent,
    HoverTable
  ],
  exports: [
    TestComponent,
    HoverTable
  ],
  providers: [
    TestService
  ]
)
export default class TestModule 

最后是我的组件

@Component(
  selector: 'test-list',
  template: require('./test.html')
)
export class TestComponent 


   constructor(protected service: TestService) 
      //console.log(service);

   

【问题讨论】:

你试过console.log( this. _configuration )吗? 我没有影响到我的类中的 _configuration,它只是我的构造函数的一个本地属性。 @estus 我用大量数据编辑了我的问题 【参考方案1】:
export class MyService 

  protected config: Config;

  constructor(protected _http: Http, @Inject(Config) _configuration: Config) 
    console.log(this.config); // undefined
    console.log(_configuration); // undefined
  

您永远不会在任何地方初始化配置字段,因此它是未定义的。你只需要

export class MyService 

  protected config: Config;

  constructor(protected _http: Http, _configuration: Config) 
    this.config = _configuration;
  

或者干脆

export class MyService 

  protected config: Config;

  constructor(protected _http: Http, protected config: Config) 
  

由于 MyService 是一项服务,因此必须将其添加到模块的提供者中,而不是添加到声明中(用于组件、管道和指令):

@NgModule(
  providers: [
    MuleService,
    Config,
    MyService
  ]
)

如果您只想将 TestService 用作服务,而不是 MyService,请确保 TestService 有一个构造函数,该构造函数也接受所有必须注入的参数:

constructor(http: Http, config: Config) 
  super(http, config);

【讨论】:

我同意我的参数配置从未设置,一开始我像你一样填写它,但正如下面一行所说,甚至 console.log(_configuration);未定义,因此问题不在我的构造函数之外。对于提供商,我也按照您所说的那样定义了它,但是即使这样也无法访问我的配置。我会按照你说的现在尝试编辑 TestService! 如果还是不行,就提供plunkr重现问题。 我无法解析 TestService 的所有参数,即使我将 Config 和 MyService 添加为我的测试模块的声明和导入。如果明天没有人知道,我会尝试做一个plunker。谢谢! 嗨@JB Nizet,感谢您的回答。现在好了。我做了一个样品 plunker,但我没有想到我们让它工作,但我仍然把它固定在我身边!谢谢 对于那些需要灵感的人来说,这样做是这样的plnkr.co/edit/kciq3EAdjUYSH3m66ScT

以上是关于Angular 2 将一个类注入到服务中的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 - 如何将依赖项注入到自定义类中,该类不是组件并且不作为服务公开

Angular依赖注入小解

将 AngularJS 对象作为 TypeScript 类注入(缺少方法)

更新到 Angular 10 后,如果没有“new”,就无法调用类构造函数 UpgradeComponent

如何在 Angular 2 中添加类到主机?

将 angularjs 服务注入 Angular