标签:java color 构造函数 eve from style dep 实例化 例子
不需要创建 Angular 注入器。 Angular 在启动过程中自动为我们创建一个应用级注入器
@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 中注册的提供商可以被整个应用访问
组件中注册的提供商只在该组件及其子组件中可用
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}`); } }
假设某个旧组件依赖一个OldLogger
类。 OldLogger
和NewLogger
具有相同的接口,但是由于某些原因, 我们不能升级这个旧组件并使用它
[ NewLogger,
// Not aliased! Creates two instances of `NewLogger`
{ provide: OldLogger, useClass: NewLogger}]
解决方案:使用useExisting选项指定别名。
[ NewLogger,
// Alias OldLogger w/ reference to NewLogger
{ provide: OldLogger, useExisting: NewLogger}]
let silentLogger = {
logs: [‘Silent logger says "Shhhhh!". Provided via "useValue"‘],
log: () => {}
};
[{ provide: Logger, useValue: silentLogger }]
标签:java color 构造函数 eve from style dep 实例化 例子
原文地址:http://www.cnblogs.com/vs1435/p/7810629.html