Skip to content
This repository was archived by the owner on Dec 4, 2017. It is now read-only.

Commit ebd8b48

Browse files
committed
docs(di-cookbook): InjectionToken->OpaqueToken; clarify class-interface
1 parent f38620d commit ebd8b48

File tree

11 files changed

+170
-127
lines changed

11 files changed

+170
-127
lines changed

public/docs/_examples/cb-dependency-injection/ts/src/app/date-logger.service.ts

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,10 @@ import { Injectable } from '@angular/core';
44

55
import { LoggerService } from './logger.service';
66

7-
// #docregion minimal-logger
8-
// class used as a restricting interface (hides other public members)
9-
export abstract class MinimalLogger {
10-
logInfo: (msg: string) => void;
11-
logs: string[];
12-
}
13-
// #enddocregion minimal-logger
14-
15-
/*
16-
// Transpiles to:
17-
// #docregion minimal-logger-transpiled
18-
var MinimalLogger = (function () {
19-
function MinimalLogger() {}
20-
return MinimalLogger;
21-
}());
22-
exports("MinimalLogger", MinimalLogger);
23-
// #enddocregion minimal-logger-transpiled
24-
*/
25-
267
// #docregion date-logger-service
278
@Injectable()
289
// #docregion date-logger-service-signature
29-
export class DateLoggerService extends LoggerService implements MinimalLogger
10+
export class DateLoggerService extends LoggerService
3011
// #enddocregion date-logger-service-signature
3112
{
3213
logInfo(msg: any) { super.logInfo(stamp(msg)); }
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Illustrative (not used), mini-version of the actual HeroOfTheMonthComponent
2+
// Injecting with the MinimalLogger "interface-class"
3+
import { Component, NgModule } from '@angular/core';
4+
import { LoggerService } from './logger.service';
5+
import { MinimalLogger } from './minimal-logger.service';
6+
7+
// #docregion
8+
@Component({
9+
selector: 'hero-of-the-month',
10+
templateUrl: './hero-of-the-month.component.html',
11+
// Todo: move this aliasing, `useExisting` provider to the AppModule
12+
providers: [{ provide: MinimalLogger, useExisting: LoggerService }]
13+
})
14+
export class HeroOfTheMonthComponent {
15+
logs: string[] = [];
16+
constructor(logger: MinimalLogger) {
17+
logger.logInfo('starting up');
18+
}
19+
}
20+
// #enddocregion
21+
22+
// This NgModule exists only to avoid the Angular language service's "undeclared component" error
23+
@NgModule({
24+
declarations: [ HeroOfTheMonthComponent ]
25+
})
26+
class NoopModule {}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<h3>{{title}}</h3>
2+
<div>Winner: <strong>{{heroOfTheMonth.name}}</strong></div>
3+
<div>Reason for award: <strong>{{heroOfTheMonth.description}}</strong></div>
4+
<div>Runners-up: <strong id="rups1">{{runnersUp}}</strong></div>
5+
6+
<p>Logs:</p>
7+
<div id="logs">
8+
<div *ngFor="let log of logs">{{log}}</div>
9+
</div>

public/docs/_examples/cb-dependency-injection/ts/src/app/hero-of-the-month.component.ts

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
/* tslint:disable:one-line:check-open-brace*/
22
// #docplaster
3-
// #docregion opaque-token
4-
import { OpaqueToken } from '@angular/core';
3+
// #docregion injection-token
4+
import { InjectionToken } from '@angular/core';
55

6-
export const TITLE = new OpaqueToken('title');
7-
// #enddocregion opaque-token
6+
export const TITLE = new InjectionToken<string>('title');
7+
// #enddocregion injection-token
88

99
// #docregion hero-of-the-month
1010
import { Component, Inject } from '@angular/core';
1111

12-
import { DateLoggerService,
13-
MinimalLogger } from './date-logger.service';
12+
import { DateLoggerService } from './date-logger.service';
1413
import { Hero } from './hero';
1514
import { HeroService } from './hero.service';
1615
import { LoggerService } from './logger.service';
16+
import { MinimalLogger } from './minimal-logger.service';
1717
import { RUNNERS_UP,
1818
runnersUpFactory } from './runners-up';
1919

@@ -22,28 +22,16 @@ import { RUNNERS_UP,
2222
const someHero = new Hero(42, 'Magma', 'Had a great month!', '555-555-5555');
2323
// #enddocregion some-hero
2424

25-
const template = `
26-
<h3>{{title}}</h3>
27-
<div>Winner: <strong>{{heroOfTheMonth.name}}</strong></div>
28-
<div>Reason for award: <strong>{{heroOfTheMonth.description}}</strong></div>
29-
<div>Runners-up: <strong id="rups1">{{runnersUp}}</strong></div>
30-
31-
<p>Logs:</p>
32-
<div id="logs">
33-
<div *ngFor="let log of logs">{{log}}</div>
34-
</div>
35-
`;
36-
3725
// #docregion hero-of-the-month
3826
@Component({
3927
selector: 'hero-of-the-month',
40-
template: template,
28+
templateUrl: './hero-of-the-month.component.html',
4129
providers: [
4230
// #docregion use-value
4331
{ provide: Hero, useValue: someHero },
44-
// #docregion provide-opaque-token
32+
// #docregion provide-injection-token
4533
{ provide: TITLE, useValue: 'Hero of the Month' },
46-
// #enddocregion provide-opaque-token
34+
// #enddocregion provide-injection-token
4735
// #enddocregion use-value
4836
// #docregion use-class
4937
{ provide: HeroService, useClass: HeroService },
@@ -52,9 +40,9 @@ const template = `
5240
// #docregion use-existing
5341
{ provide: MinimalLogger, useExisting: LoggerService },
5442
// #enddocregion use-existing
55-
// #docregion provide-opaque-token, use-factory
43+
// #docregion provide-injection-token, use-factory
5644
{ provide: RUNNERS_UP, useFactory: runnersUpFactory(2), deps: [Hero, HeroService] }
57-
// #enddocregion provide-opaque-token, use-factory
45+
// #enddocregion provide-injection-token, use-factory
5846
]
5947
})
6048
export class HeroOfTheMonthComponent {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// #docregion
2+
// Class used as a "narrowing" interface that exposes a minimal logger
3+
// Other members of the actual implementation are invisible
4+
export abstract class MinimalLogger {
5+
logs: string[];
6+
logInfo: (msg: string) => void;
7+
}
8+
// #enddocregion
9+
10+
/*
11+
// Transpiles to:
12+
// #docregion minimal-logger-transpiled
13+
var MinimalLogger = (function () {
14+
function MinimalLogger() {}
15+
return MinimalLogger;
16+
}());
17+
exports("MinimalLogger", MinimalLogger);
18+
// #enddocregion minimal-logger-transpiled
19+
*/
20+
21+
// See http://stackoverflow.com/questions/43154832/unexpected-token-export-in-angular-app-with-systemjs-and-typescript/
22+
export const _ = 0;

public/docs/_examples/cb-dependency-injection/ts/src/app/runners-up.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// #docplaster
22
// #docregion
3-
import { OpaqueToken } from '@angular/core';
3+
import { InjectionToken } from '@angular/core';
44

55
import { Hero } from './hero';
66
import { HeroService } from './hero.service';
77

88
// #docregion runners-up
9-
export const RUNNERS_UP = new OpaqueToken('RunnersUp');
9+
export const RUNNERS_UP = new InjectionToken<string>('RunnersUp');
1010
// #enddocregion runners-up
1111

1212
// #docregion factory-synopsis

public/docs/_examples/dependency-injection/ts/src/app/app.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// #docregion imports
44
import { Component, Inject } from '@angular/core';
55

6-
import { APP_CONFIG, AppConfig } from './app.config';
6+
import { APP_CONFIG, AppConfig } from './app.config';
77
import { Logger } from './logger.service';
88
import { UserService } from './user.service';
99
// #enddocregion imports

public/docs/_examples/dependency-injection/ts/src/app/app.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// #docregion token
2-
import { OpaqueToken } from '@angular/core';
2+
import { InjectionToken } from '@angular/core';
33

4-
export let APP_CONFIG = new OpaqueToken('app.config');
4+
export let APP_CONFIG = new InjectionToken<AppConfig>('app.config');
55
// #enddocregion token
66

77
// #docregion config

0 commit comments

Comments
 (0)