码迷,mamicode.com
首页 > 其他好文 > 详细

angular2-依赖注入

时间:2017-11-09 18:43:34      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:java   color   构造函数   eve   from   style   dep   实例化   例子   

配置注入器:

不需要创建 Angular 注入器。 Angular 在启动过程中自动为我们创建一个应用级注入器

NgModule中注册提供商

@NgModule({
  imports: [
    BrowserModule
  ],
  declarations: [
    AppComponent,
    CarComponent,
    HeroesComponent,
/* . . . */
  ],
  providers: [
    UserService,
    { provide: APP_CONFIG, useValue: HERO_DI_CONFIG }
  ],
  bootstrap: [ AppComponent ]
})
export class AppModule { }

 

在组件中注册提供商

import { Component }          from ‘@angular/core‘;
import { HeroService }        from ‘./hero.service‘;
@Component({
  selector: ‘app-heroes‘,
  providers: [HeroService],
  template: `
  <h2>Heroes</h2>
  <app-hero-list></app-hero-list>
  `
})
export class HeroesComponent { }

  

该用 NgModule 还是应用组件?

NgModule 中的提供商是被注册到根注入器。这意味着在 NgModule 中注册的提供商可以被整个应用访问

组件中注册的提供商只在该组件及其子组件中可用

 

构造函数注入:

import { Component }   from ‘@angular/core‘;
import { Hero }        from ‘./hero‘;
import { HeroService } from ‘./hero.service‘;
 
@Component({
  selector: ‘app-hero-list‘,
  template: `...`
})
export class HeroListComponent {
  constructor(heroService: HeroService) {
    this.heroes = heroService.getHeroes();
  }
}

  

显式创建注入器:

injector = ReflectiveInjector.resolveAndCreate([Car, Engine, Tires]);
let car = injector.get(Car);

  

单例服务

在一个注入器的范围内,依赖都是单例的。 在这个例子中,HeroesComponent和它的子组件HeroListComponent共享同一个HeroService实例

 

当服务需要别的服务时

同样用构造函数注入模式,来添加一个带有Logger参数的构造函数。

mport { Injectable } from ‘@angular/core‘;
import { HEROES }     from ‘./mock-heroes‘;
import { Logger }     from ‘../logger.service‘;
 
@Injectable()
export class HeroService {
  constructor(private logger: Logger) {  }
  getHeroes() {
    this.logger.log(‘Getting heroes ...‘);
    return HEROES;
  }
}

@Injectable() 标识一个类可以被注入器实例化。 通常,在试图实例化没有被标识为@Injectable()的类时,注入器会报错。 

 @Component(和随后将会学到的@Directive@Pipe一样)是 Injectable 的子类型。 实际上,正是这些@Injectable()装饰器是把一个类标识为注入器实例化的目标。

 

providers: [Logger] 其实是用于注册提供商的简写表达式。 使用的是一个带有两个属性的提供商对象字面量:

[{ provide: Logger, useClass: Logger }]

第一个是令牌 (token),它作为键值 (key) 使用,用于定位依赖值和注册提供商。

 

带依赖的类提供商

@Injectable()
class EvenBetterLogger extends Logger {
  constructor(private userService: UserService) { super(); }

  log(message: string) {
    let name = this.userService.user.name;
    super.log(`Message to ${name}: ${message}`);
  }
}

  

别名类提供商 useExisting

假设某个旧组件依赖一个OldLogger类。 OldLoggerNewLogger具有相同的接口,但是由于某些原因, 我们不能升级这个旧组件并使用它

[ NewLogger,
  // Not aliased! Creates two instances of `NewLogger`
  { provide: OldLogger, useClass: NewLogger}]

解决方案:使用useExisting选项指定别名。

[ NewLogger,
  // Alias OldLogger w/ reference to NewLogger
  { provide: OldLogger, useExisting: NewLogger}]

  

值提供商 useValue

let silentLogger = {
  logs: [‘Silent logger says "Shhhhh!". Provided via "useValue"‘],
  log: () => {}
};

[{ provide: Logger, useValue: silentLogger }]

  

工厂提供商

 

angular2-依赖注入

标签:java   color   构造函数   eve   from   style   dep   实例化   例子   

原文地址:http://www.cnblogs.com/vs1435/p/7810629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!