From c1f2c397ff50ed3663317bd947e4cbfb4eb9e376 Mon Sep 17 00:00:00 2001 From: Torgeir Helgevold Date: Sat, 26 Mar 2016 12:18:13 -0400 Subject: [PATCH] docs: add DI cookbook --- gulpfile.js | 1 + public/docs/_examples/.gitignore | 1 + .../ts/app/highlight.directive.2.ts | 6 +- .../ts/app/highlight.directive.ts | 21 +- .../cb-dependency-injection/e2e-spec.js | 98 ++ .../cb-dependency-injection/ts/.gitignore | 1 + .../ts/app/app.component.html | 39 + .../ts/app/app.component.ts | 46 + .../ts/app/date-logger.service.ts | 37 + .../ts/app/hero-bio.component.ts | 29 + .../ts/app/hero-bios.component.ts | 52 + .../ts/app/hero-cache.service.ts | 19 + .../ts/app/hero-contact.component.ts | 39 + .../ts/app/hero-data.ts | 14 + .../ts/app/hero-of-the-month.component.ts | 75 ++ .../ts/app/hero.service.ts | 22 + .../cb-dependency-injection/ts/app/hero.ts | 9 + .../ts/app/highlight.directive.ts | 28 + .../ts/app/logger.service.ts | 16 + .../cb-dependency-injection/ts/app/main.ts | 25 + .../ts/app/parent-finder.component.ts | 227 +++++ .../ts/app/runners-up.ts | 25 + .../ts/app/sorted-heroes.component.ts | 51 + .../ts/app/user-context.service.ts | 32 + .../ts/app/user.service.ts | 10 + .../ts/example-config.json | 0 .../cb-dependency-injection/ts/index.html | 44 + .../cb-dependency-injection/ts/plnkr.json | 9 + .../cb-dependency-injection/ts/sample.css | 26 + public/docs/_examples/package.json | 2 +- .../_examples/quickstart/ts/package.1.json | 2 +- public/docs/_examples/tslint.json | 93 ++ public/docs/dart/latest/cookbook/_data.json | 8 +- .../latest/cookbook/dependency-injection.jade | 1 + public/docs/js/latest/cookbook/_data.json | 10 +- .../latest/cookbook/dependency-injection.jade | 1 + public/docs/ts/latest/cookbook/_data.json | 5 + .../latest/cookbook/dependency-injection.jade | 908 ++++++++++++++++++ .../ts/latest/guide/attribute-directives.jade | 9 +- .../ts/latest/guide/dependency-injection.jade | 7 +- public/docs/ts/latest/guide/pipes.jade | 3 +- public/docs/ts/latest/guide/router.jade | 3 +- .../cookbooks/dependency-injection/alex.png | Bin 0 -> 20533 bytes .../cookbooks/dependency-injection/alice.png | Bin 0 -> 46898 bytes .../date-logger-entry.png | Bin 0 -> 10087 bytes .../hero-bio-and-content.png | Bin 0 -> 9554 bytes .../hero-bio-contact-no-host.png | Bin 0 -> 9975 bytes .../hero-bios-and-contacts.png | Bin 0 -> 29600 bytes .../dependency-injection/hero-bios.png | Bin 0 -> 16720 bytes .../dependency-injection/hero-of-month.png | Bin 0 -> 26538 bytes .../dependency-injection/highlight.png | Bin 0 -> 16043 bytes .../dependency-injection/logged-in-user.png | Bin 0 -> 8274 bytes .../minimal-logger-intellisense.png | Bin 0 -> 15037 bytes .../dependency-injection/sorted-heroes.png | Bin 0 -> 8187 bytes 54 files changed, 2027 insertions(+), 27 deletions(-) create mode 100644 public/docs/_examples/cb-dependency-injection/e2e-spec.js create mode 100644 public/docs/_examples/cb-dependency-injection/ts/.gitignore create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/app.component.html create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/app.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/date-logger.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-bio.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-bios.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-cache.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-contact.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-data.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero-of-the-month.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/hero.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/highlight.directive.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/logger.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/main.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/parent-finder.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/runners-up.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/sorted-heroes.component.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/user-context.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/app/user.service.ts create mode 100644 public/docs/_examples/cb-dependency-injection/ts/example-config.json create mode 100644 public/docs/_examples/cb-dependency-injection/ts/index.html create mode 100644 public/docs/_examples/cb-dependency-injection/ts/plnkr.json create mode 100644 public/docs/_examples/cb-dependency-injection/ts/sample.css create mode 100644 public/docs/_examples/tslint.json create mode 100644 public/docs/dart/latest/cookbook/dependency-injection.jade create mode 100644 public/docs/js/latest/cookbook/dependency-injection.jade create mode 100644 public/docs/ts/latest/cookbook/dependency-injection.jade create mode 100644 public/resources/images/cookbooks/dependency-injection/alex.png create mode 100644 public/resources/images/cookbooks/dependency-injection/alice.png create mode 100644 public/resources/images/cookbooks/dependency-injection/date-logger-entry.png create mode 100644 public/resources/images/cookbooks/dependency-injection/hero-bio-and-content.png create mode 100644 public/resources/images/cookbooks/dependency-injection/hero-bio-contact-no-host.png create mode 100644 public/resources/images/cookbooks/dependency-injection/hero-bios-and-contacts.png create mode 100644 public/resources/images/cookbooks/dependency-injection/hero-bios.png create mode 100644 public/resources/images/cookbooks/dependency-injection/hero-of-month.png create mode 100644 public/resources/images/cookbooks/dependency-injection/highlight.png create mode 100644 public/resources/images/cookbooks/dependency-injection/logged-in-user.png create mode 100644 public/resources/images/cookbooks/dependency-injection/minimal-logger-intellisense.png create mode 100644 public/resources/images/cookbooks/dependency-injection/sorted-heroes.png diff --git a/gulpfile.js b/gulpfile.js index 774c1c4381..2ab015cdc7 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -74,6 +74,7 @@ var _exampleBoilerplateFiles = [ 'package.json', 'styles.css', 'tsconfig.json', + 'tslint.json', 'typings.json' ]; diff --git a/public/docs/_examples/.gitignore b/public/docs/_examples/.gitignore index 7a15251d4f..7e2250f509 100644 --- a/public/docs/_examples/.gitignore +++ b/public/docs/_examples/.gitignore @@ -6,5 +6,6 @@ package.json karma.conf.js karma-test-shim.js tsconfig.json +tslint.json npm-debug*. **/protractor.config.js diff --git a/public/docs/_examples/attribute-directives/ts/app/highlight.directive.2.ts b/public/docs/_examples/attribute-directives/ts/app/highlight.directive.2.ts index 9cf0b95970..1f42c5773f 100644 --- a/public/docs/_examples/attribute-directives/ts/app/highlight.directive.2.ts +++ b/public/docs/_examples/attribute-directives/ts/app/highlight.directive.2.ts @@ -12,8 +12,10 @@ import {Directive, ElementRef, Input} from 'angular2/core'; }) export class HighlightDirective { + // #docregion ctor - constructor(private el: ElementRef) { } + private _el:HTMLElement; + constructor(el: ElementRef) { this._el = el.nativeElement; } // #enddocregion ctor // #docregion mouse-methods @@ -21,7 +23,7 @@ export class HighlightDirective { onMouseLeave() { this._highlight(null); } private _highlight(color: string) { - this.el.nativeElement.style.backgroundColor = color; + this._el.style.backgroundColor = color; } // #enddocregion mouse-methods diff --git a/public/docs/_examples/attribute-directives/ts/app/highlight.directive.ts b/public/docs/_examples/attribute-directives/ts/app/highlight.directive.ts index 6a26780057..4380174c8f 100644 --- a/public/docs/_examples/attribute-directives/ts/app/highlight.directive.ts +++ b/public/docs/_examples/attribute-directives/ts/app/highlight.directive.ts @@ -12,6 +12,9 @@ import {Directive, ElementRef, Input} from 'angular2/core'; // #docregion class-1 export class HighlightDirective { + + private _defaultColor = 'red'; + private _el:HTMLElement; // #enddocregion class-1 // #enddocregion full /* @@ -20,21 +23,21 @@ export class HighlightDirective { // #enddocregion highlight */ // #docregion full + +// #docregion defaultColor + @Input() set defaultColor(colorName:string){ + this._defaultColor = colorName || this._defaultColor; + } +// #enddocregion defaultColor // #docregion class-1 + // #docregion color @Input('myHighlight') highlightColor: string; // #enddocregion color - private _defaultColor = 'red'; // #enddocregion class-1 - // #docregion defaultColor - @Input() set defaultColor(colorName:string){ - this._defaultColor = colorName || this._defaultColor; - } - // #enddocregion defaultColor // #docregion class-1 - - constructor(private el: ElementRef) { } + constructor(el: ElementRef) { this._el = el.nativeElement; } // #docregion mouse-enter onMouseEnter() { this._highlight(this.highlightColor || this._defaultColor); } @@ -42,7 +45,7 @@ export class HighlightDirective { onMouseLeave() { this._highlight(null); } private _highlight(color:string) { - this.el.nativeElement.style.backgroundColor = color; + this._el.style.backgroundColor = color; } } // #enddocregion class-1 diff --git a/public/docs/_examples/cb-dependency-injection/e2e-spec.js b/public/docs/_examples/cb-dependency-injection/e2e-spec.js new file mode 100644 index 0000000000..aeb0e68b17 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/e2e-spec.js @@ -0,0 +1,98 @@ +describe('Dependency Injection Cookbook', function () { + + beforeAll(function () { + browser.get(''); + }); + + it('should render Logged in User example', function () { + var loggedInUser = element.all(by.xpath('//h3[text()="Logged in user"]')).get(0); + expect(loggedInUser).toBeDefined(); + }); + + it('"Bombasto" should be the logged in user', function () { + loggedInUser = element.all(by.xpath('//div[text()="Name: Bombasto"]')).get(0); + expect(loggedInUser).toBeDefined(); + }); + + it('should render sorted heroes', function () { + var sortedHeroes = element.all(by.xpath('//h3[text()="Sorted Heroes" and position()=1]')).get(0); + expect(sortedHeroes).toBeDefined(); + }); + + it('Mr. Nice should be in sorted heroes', function () { + var sortedHero = element.all(by.xpath('//sorted-heroes/[text()="Mr. Nice" and position()=2]')).get(0); + expect(sortedHero).toBeDefined(); + }); + + it('RubberMan should be in sorted heroes', function () { + sortedHero = element.all(by.xpath('//sorted-heroes/[text()="RubberMan" and position()=3]')).get(0); + expect(sortedHero).toBeDefined(); + }); + + it('Magma should be in sorted heroes', function () { + sortedHero = element.all(by.xpath('//sorted-heroes/[text()="Magma"]')).get(0); + expect(sortedHero).toBeDefined(); + }); + + it('should render Hero of the Month', function () { + var heroOfTheMonth = element.all(by.xpath('//h3[text()="Hero of the month"]')).get(0); + expect(heroOfTheMonth).toBeDefined(); + }); + + it('should render Hero Bios', function () { + var heroBios = element.all(by.xpath('//h3[text()="Hero Bios"]')).get(0); + expect(heroBios).toBeDefined(); + }); + + it('should render Magma\'s description in Hero Bios', function () { + var magmaText = element.all(by.xpath('//textarea[text()="Hero of all trades"]')).get(0); + expect(magmaText).toBeDefined(); + }); + + it('should render Magma\'s phone in Hero Bios and Contacts', function () { + var magmaPhone = element.all(by.xpath('//div[text()="Phone #: 555-555-5555"]')).get(0); + expect(magmaPhone).toBeDefined(); + }); + + it('should render Hero-of-the-Month runner-ups', function () { + var runnersUp = element(by.id('rups')).getText(); + expect(runnersUp).toContain('RubberMan, Mr. Nice'); + }); + + it('should render DateLogger log entry in Hero-of-the-Month', function () { + var logs = element.all(by.id('logs')).get(0).getText(); + expect(logs).toContain('INFO: starting up at'); + }); + + it('should highlight Hero Bios and Contacts container when mouseover', function () { + var target = element(by.css('div[myHighlight="yellow"]')) + var yellow = "rgba(255, 255, 0, 1)"; + + expect(target.getCssValue('background-color')).not.toEqual(yellow); + browser.actions().mouseMove(target).perform(); + expect(target.getCssValue('background-color')).toEqual(yellow); + }); + + describe('in Parent Finder', function () { + var cathy1 = element(by.css('alex cathy')); + var craig1 = element(by.css('alex craig')); + var carol1 = element(by.css('alex carol p')); + var carol2 = element(by.css('barry carol p')); + + it('"Cathy" should find "Alex" via the component class', function () { + expect(cathy1.getText()).toContain('Found Alex via the component'); + }); + + it('"Craig" should not find "Alex" via the base class', function () { + expect(craig1.getText()).toContain('Did not find Alex via the base'); + }); + + it('"Carol" within "Alex" should have "Alex" parent', function () { + expect(carol1.getText()).toContain('Alex'); + }); + + it('"Carol" within "Barry" should have "Barry" parent', function () { + expect(carol2.getText()).toContain('Barry'); + }); + }) +}); diff --git a/public/docs/_examples/cb-dependency-injection/ts/.gitignore b/public/docs/_examples/cb-dependency-injection/ts/.gitignore new file mode 100644 index 0000000000..cf44e148ba --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/.gitignore @@ -0,0 +1 @@ +**/*.js \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/app.component.html b/public/docs/_examples/cb-dependency-injection/ts/app/app.component.html new file mode 100644 index 0000000000..c27281f2af --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/app.component.html @@ -0,0 +1,39 @@ +

DI Cookbook

+
+

Logged in user

+
Name: {{userContext.name}}
+
Role: {{userContext.role}}
+
+ +
+

Hero Bios

+ +
+ + +
+

Hero Bios and Contacts

+
+ +
+
+ + +
+ +
+ + +
+

Unsorted Heroes

+ +
+ +
+

Sorted Heroes

+ +
+ +
+ +
\ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/app.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/app.component.ts new file mode 100644 index 0000000000..2e4485f665 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/app.component.ts @@ -0,0 +1,46 @@ +// #docregion +import { Component } from 'angular2/core'; + +import { HeroBiosComponent, + HeroBiosAndContactsComponent} from './hero-bios.component'; +import { HeroOfTheMonthComponent } from './hero-of-the-month.component'; +import { HeroesBaseComponent, + SortedHeroesComponent } from './sorted-heroes.component'; +import { HighlightDirective } from './highlight.directive'; +import { ParentFinderComponent } from './parent-finder.component'; + +const DIRECTIVES = [ + HeroBiosComponent, HeroBiosAndContactsComponent, + HeroesBaseComponent, SortedHeroesComponent, + HeroOfTheMonthComponent, + HighlightDirective, + ParentFinderComponent +]; + +// #docregion import-services +import { LoggerService } from './logger.service'; +import { UserContextService } from './user-context.service'; +import { UserService } from './user.service'; + +@Component({ + selector: 'my-app', + templateUrl:'app/app.component.html', + directives: DIRECTIVES, +// #docregion providers + providers: [LoggerService, UserContextService, UserService] +// #enddocregion providers +}) +export class AppComponent { +// #enddocregion import-services + + private userId:number = 1; + + // #docregion ctor + constructor(logger:LoggerService, public userContext:UserContextService) { + userContext.loadUser(this.userId); + logger.logInfo('AppComponent initialized'); + } + // #enddocregion ctor +// #docregion import-services +} +// #enddocregion import-services diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/date-logger.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/date-logger.service.ts new file mode 100644 index 0000000000..125ba37c2b --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/date-logger.service.ts @@ -0,0 +1,37 @@ +/* tslint:disable:one-line:check-open-brace*/ +// #docregion +import { Injectable } from 'angular2/core'; +import { LoggerService } from './logger.service'; + +// #docregion minimal-logger +// class used as a restricting interface (hides other public members) +export abstract class MinimalLogger { + logInfo: (msg: string) => void; + logs: string[]; +} +// #enddocregion minimal-logger + +/* +// Transpiles to: +// #docregion minimal-logger-transpiled + var MinimalLogger = (function () { + function MinimalLogger() {} + return MinimalLogger; + }()); + exports("MinimalLogger", MinimalLogger); +// #enddocregion minimal-logger-transpiled + */ + +// #docregion date-logger-service +@Injectable() +// #docregion date-logger-service-signature +export class DateLoggerService extends LoggerService implements MinimalLogger +// #enddocregion date-logger-service-signature +{ + logInfo(msg: any) { super.logInfo(stamp(msg)); } + logDebug(msg: any) { super.logInfo(stamp(msg)); } + logError(msg: any) { super.logError(stamp(msg)); } +} + +function stamp(msg: any) { return msg + ' at ' + new Date(); } +// #enddocregion date-logger-service diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-bio.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-bio.component.ts new file mode 100644 index 0000000000..6b006fcc56 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-bio.component.ts @@ -0,0 +1,29 @@ +// #docregion +import {Component, Input, OnInit} from 'angular2/core'; + +import {Hero} from './hero'; +import {HeroCacheService} from './hero-cache.service'; + +// #docregion component +@Component({ + selector:'hero-bio', + // #docregion template + template:` +

{{hero.name}}

+ + `, + // #enddocregion template + providers: [HeroCacheService] +}) + +export class HeroBioComponent implements OnInit { + + @Input() heroId:number; + + constructor(private _heroCache:HeroCacheService) { } + + ngOnInit() { this._heroCache.fetchCachedHero(this.heroId); } + + get hero() { return this._heroCache.hero; } +} +// #enddocregion component diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-bios.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-bios.component.ts new file mode 100644 index 0000000000..9d14daf648 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-bios.component.ts @@ -0,0 +1,52 @@ +// #docplaster +// #docregion +import { Component} from 'angular2/core'; + +import { HeroContactComponent } from './hero-contact.component'; +import { HeroBioComponent } from './hero-bio.component'; +import { HeroService } from './hero.service'; +import { LoggerService } from './logger.service'; + +//////// HeroBiosComponent //// +// #docregion simple +@Component({ + selector:'hero-bios', + template:` + + + `, + directives:[HeroBioComponent], + providers: [HeroService] +}) +export class HeroBiosComponent{ +// #enddocregion simple +// #docregion ctor + constructor(logger: LoggerService) { + logger.logInfo('Creating HeroBiosComponent'); + } +// #enddocregion ctor +// #docregion simple +} +// #enddocregion simple + +//////// HeroBiosAndContactsComponent //// +// #docregion hero-bios-and-contacts +@Component({ + selector:'hero-bios-and-contacts', + // #docregion template + template:` + + + `, + // #enddocregion template + directives:[HeroBioComponent, HeroContactComponent], + // #docregion class-provider + providers: [HeroService] + // #enddocregion class-provider +}) +export class HeroBiosAndContactsComponent{ + constructor(logger: LoggerService) { + logger.logInfo('Creating HeroBiosAndContactsComponent'); + } +} +// #enddocregion hero-bios-and-contacts \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-cache.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-cache.service.ts new file mode 100644 index 0000000000..c0c7ce581f --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-cache.service.ts @@ -0,0 +1,19 @@ +// #docregion +import {Injectable} from 'angular2/core'; +import {Hero} from './hero'; +import {HeroService} from './hero.service'; + +// #docregion service +@Injectable() +export class HeroCacheService { + hero:Hero; + constructor(private _heroService:HeroService){} + + fetchCachedHero(id:number){ + if (!this.hero) { + this.hero = this._heroService.getHeroById(id); + } + return this.hero + } +} +// #enddocregion service diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-contact.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-contact.component.ts new file mode 100644 index 0000000000..42163d3f3e --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-contact.component.ts @@ -0,0 +1,39 @@ +// #docplaster +// #docregion +import {Component, ElementRef, Host, Inject, Optional} from 'angular2/core'; +import {HeroCacheService} from './hero-cache.service'; +import {LoggerService} from './logger.service'; + +// #docregion component +@Component({ + selector:'hero-contact', + template:` +
Phone #: {{phoneNumber}} + !!!
` +}) +export class HeroContactComponent { + + hasLogger = false; + + constructor( + // #docregion ctor-params + @Host() // limit to the host component's instance of the HeroCacheService + private _heroCache: HeroCacheService, + + @Host() // limit search for logger; hides the application-wide logger + @Optional() // ok if the logger doesn't exist + private _loggerService: LoggerService + // #enddocregion ctor-params + ) { + if (_loggerService) { + this.hasLogger = true; + _loggerService.logInfo('HeroContactComponent can log!'); + } + // #docregion ctor + } + // #enddocregion ctor + + get phoneNumber() { return this._heroCache.hero.phone; } + +} +// #enddocregion component diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-data.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-data.ts new file mode 100644 index 0000000000..18133fd771 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-data.ts @@ -0,0 +1,14 @@ +// #docregion +import {Hero} from './hero'; + +export class HeroData { + createDb() { + let heroes = [ + new Hero(1,"Windstorm"), + new Hero(2,"Bombasto"), + new Hero(3,"Magneta"), + new Hero(4,"Tornado") + ]; + return {heroes}; + } +} diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero-of-the-month.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero-of-the-month.component.ts new file mode 100644 index 0000000000..02dcae4824 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero-of-the-month.component.ts @@ -0,0 +1,75 @@ +/* tslint:disable:one-line:check-open-brace*/ +// #docplaster +// #docregion opaque-token +import {OpaqueToken} from 'angular2/core'; + +export const TITLE = new OpaqueToken('title'); +// #enddocregion opaque-token + +// #docregion hero-of-the-month +import { Component, Inject, provide } from 'angular2/core'; + +import { DateLoggerService, + MinimalLogger } from './date-logger.service'; +import { Hero } from './hero'; +import { HeroService } from './hero.service'; +import { LoggerService } from './logger.service'; +import { RUNNERS_UP, + runnersUpFactory } from './runners-up'; + +// #enddocregion hero-of-the-month +// #docregion some-hero +const someHero = new Hero(42, 'Magma', 'Had a great month!', '555-555-5555'); +// #enddocregion some-hero + +const template = ` +

{{title}}

+
Winner: {{heroOfTheMonth.name}}
+
Reason for award: {{heroOfTheMonth.description}}
+
Runners-up: {{runnersUp}}
+ +

Logs:

+
+
{{log}}
+
+ `; + +// #docregion hero-of-the-month +@Component({ + selector: 'hero-of-the-month', + template: template, + providers: [ + // #docregion use-value + provide(Hero, {useValue: someHero}), + // #docregion provide-opaque-token + provide(TITLE, {useValue: 'Hero of the Month'}), + // #enddocregion provide-opaque-token + // #enddocregion use-value + // #docregion use-class + provide(HeroService, {useClass: HeroService}), + provide(LoggerService, {useClass: DateLoggerService}), + // #enddocregion use-class + // #docregion use-existing + provide(MinimalLogger, {useExisting: LoggerService}), + // #enddocregion use-existing + // #docregion provide-opaque-token, use-factory + provide(RUNNERS_UP, {useFactory: runnersUpFactory(2), deps: [Hero, HeroService]}) + // #enddocregion provide-opaque-token, use-factory + ] +}) +export class HeroOfTheMonthComponent { + logs: string[] = []; + +// #docregion ctor-signature + constructor( + logger: MinimalLogger, + public heroOfTheMonth: Hero, + @Inject(RUNNERS_UP) public runnersUp: string, + @Inject(TITLE) public title: string) +// #enddocregion ctor-signature + { + this.logs = logger.logs; + logger.logInfo('starting up'); + } +} +// #enddocregion hero-of-the-month diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero.service.ts new file mode 100644 index 0000000000..274753ae8d --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero.service.ts @@ -0,0 +1,22 @@ +// #docregion +import {Injectable} from 'angular2/core'; +import {Hero} from './hero'; + +@Injectable() +export class HeroService { + + //TODO move to database + private _heros:Array = [ + new Hero(1, 'RubberMan','Hero of many talents', '123-456-7899'), + new Hero(2, 'Magma','Hero of all trades', '555-555-5555'), + new Hero(3, 'Mr. Nice','The name says it all','111-222-3333') + ]; + + getHeroById(id:number):Hero{ + return this._heros.filter(hero => hero.id === id)[0]; + } + + getAllHeroes():Array{ + return this._heros; + } +} \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/hero.ts b/public/docs/_examples/cb-dependency-injection/ts/app/hero.ts new file mode 100644 index 0000000000..51ce8ebbff --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/hero.ts @@ -0,0 +1,9 @@ +// #docregion +export class Hero{ + constructor( + public id: number, + public name:string, + public description?:string, + public phone?:string) { + } +} \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/highlight.directive.ts b/public/docs/_examples/cb-dependency-injection/ts/app/highlight.directive.ts new file mode 100644 index 0000000000..6d054e1a0b --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/highlight.directive.ts @@ -0,0 +1,28 @@ +// #docplaster +// #docregion +import {Directive, ElementRef, Input} from 'angular2/core'; + +@Directive({ + selector: '[myHighlight]', + host: { + '(mouseenter)': 'onMouseEnter()', + '(mouseleave)': 'onMouseLeave()' + } +}) +export class HighlightDirective { + + @Input('myHighlight') highlightColor: string; + + private _el: HTMLElement; + + constructor(el: ElementRef) { + this._el = el.nativeElement; + } + + onMouseEnter() { this._highlight(this.highlightColor || 'cyan'); } + onMouseLeave() { this._highlight(null); } + + private _highlight(color: string) { + this._el.style.backgroundColor = color; + } +} diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/logger.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/logger.service.ts new file mode 100644 index 0000000000..ecc75350e3 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/logger.service.ts @@ -0,0 +1,16 @@ +// #docregion +import {Injectable} from 'angular2/core'; + +@Injectable() +export class LoggerService { + logs: string[] = []; + + logInfo(msg: any) { this.log(`INFO: ${msg}`); } + logDebug(msg: any) { this.log(`DEBUG: ${msg}`); } + logError(msg: any) { this.log(`ERROR: ${msg}`, true); } + + private log(msg: any, isErr = false) { + this.logs.push(msg); + isErr ? console.error(msg) : console.log(msg); + } +} diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/main.ts b/public/docs/_examples/cb-dependency-injection/ts/app/main.ts new file mode 100644 index 0000000000..b1e35e2a67 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/main.ts @@ -0,0 +1,25 @@ +// #docregion +import { bootstrap } from 'angular2/platform/browser'; +import { provide } from 'angular2/core'; +import { XHRBackend } from 'angular2/http'; + +import { LocationStrategy, + HashLocationStrategy, + ROUTER_PROVIDERS } from 'angular2/router'; + +import { HeroData } from './hero-data'; +import { InMemoryBackendService, + SEED_DATA } from 'a2-in-memory-web-api/core'; + +import { AppComponent } from './app.component'; + +// #docregion bootstrap +bootstrap(AppComponent, [ + ROUTER_PROVIDERS, + provide(LocationStrategy, + {useClass: HashLocationStrategy}), + + provide(XHRBackend, { useClass: InMemoryBackendService }), // in-mem server + provide(SEED_DATA, { useClass: HeroData }) // in-mem server data +]).catch((err: any) => console.error(err)); +// #enddocregion bootstrap diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/parent-finder.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/parent-finder.component.ts new file mode 100644 index 0000000000..4099ec6af9 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/parent-finder.component.ts @@ -0,0 +1,227 @@ +/* tslint:disable:no-unused-variable */ +/* tslint:disable:one-line:check-open-brace*/ +// #docplaster +// #docregion +import { Component, forwardRef, Optional, provide, SkipSelf } from 'angular2/core'; + +// A component base class (see AlexComponent) +export abstract class Base { name = 'Count Basie'; } + +// Marker class, used as an interface +// #docregion parent +export abstract class Parent { name: string; } +// #enddocregion parent + +const DifferentParent = Parent; + +// #docregion provide-parent, provide-the-parent +// Helper method to provide the current component instance in the name of a `parentType`. +// #enddocregion provide-the-parent +// The `parentType` defaults to `Parent` when omitting the second parameter. +// #docregion provide-the-parent +const provideParent = +// #enddocregion provide-parent, provide-the-parent +// #docregion provide-parent + (component: any, parentType?: any) => + provide(parentType || Parent, { useExisting: forwardRef(() => component) }); +// #enddocregion provide-parent + +// Simpler syntax version that always provides the component in the name of `Parent`. +const provideTheParent = +// #docregion provide-the-parent + (component: any) => provide(Parent, { useExisting: forwardRef(() => component) }); +// #enddocregion provide-the-parent + + +///////// C - Child ////////// +// #docregion carol +const templateC = ` +
+

{{name}}

+

My parent is {{parent?.name}}

+
`; + +@Component({ + selector: 'carol', + template: templateC +}) +// #docregion carol-class +export class CarolComponent { + name= 'Carol'; + // #docregion carol-ctor + constructor( @Optional() public parent: Parent ) { } + // #enddocregion carol-ctor +} +// #enddocregion carol-class +// #enddocregion carol + +@Component({ + selector: 'chris', + template: templateC +}) +export class ChrisComponent { + name= 'Chris'; + constructor( @Optional() public parent: Parent ) { } +} + +////// Craig /////////// +/** + * Show we cannot inject a parent by its base class. + */ +// #docregion craig +@Component({ + selector: 'craig', + template: ` +
+

Craig

+ {{alex ? 'Found' : 'Did not find'}} Alex via the base class. +
` +}) +export class CraigComponent { + constructor( @Optional() public alex: Base ) { } +} +// #enddocregion craig + +// #docregion C_DIRECTIVES +const C_DIRECTIVES = [ + CarolComponent, ChrisComponent, CraigComponent, + forwardRef(() => CathyComponent) +]; +// #enddocregion C_DIRECTIVES + +//////// B - Parent ///////// +// #docregion barry +const templateB = ` +
+
+

{{name}}

+

My parent is {{parent?.name}}

+
+ + +
`; + +@Component({ + selector: 'barry', + template: templateB, + directives: C_DIRECTIVES, + providers: [ provide(Parent, { useExisting: forwardRef(() => BarryComponent) }) ] +}) +export class BarryComponent implements Parent { + name = 'Barry'; +// #docregion barry-ctor + constructor( @SkipSelf() @Optional() public parent: Parent ) { } +// #enddocregion barry-ctor +} +// #enddocregion barry + +@Component({ + selector: 'bob', + template: templateB, + directives: C_DIRECTIVES, + providers: [ provideParent(BobComponent) ] +}) +export class BobComponent implements Parent { + name= 'Bob'; + constructor( @SkipSelf() @Optional() public parent: Parent ) { } +} + +@Component({ + selector: 'beth', + template: templateB, + directives: C_DIRECTIVES, +// #docregion beth-providers + providers: [ provideParent(BethComponent, DifferentParent) ] +// #enddocregion beth-providers +}) +export class BethComponent implements Parent { + name= 'Beth'; + constructor( @SkipSelf() @Optional() public parent: Parent ) { } +} + +const B_DIRECTIVES = [ BarryComponent, BethComponent, BobComponent ]; + +///////// A - Grandparent ////// + +// #docregion alex, alex-1 +@Component({ + selector: 'alex', + template: ` +
+

{{name}}

+ + + +
`, +// #enddocregion alex-1 +// #docregion alex-providers + providers: [ provide(Parent, { useExisting: forwardRef(() => AlexComponent) }) ], +// #enddocregion alex-providers +// #docregion alex-1 + directives: C_DIRECTIVES +}) +// #enddocregion alex-1 +// Todo: Add `... implements Parent` to class signature +// #docregion alex-1 +// #docregion alex-class-signature +export class AlexComponent extends Base +// #enddocregion alex-class-signature +{ + name= 'Alex'; +} +// #enddocregion alex, alex-1 + +///// + +// #docregion alice +@Component({ + selector: 'alice', + template: ` +
+

{{name}}

+ + + + +
`, + directives: [ B_DIRECTIVES, C_DIRECTIVES ], +// #docregion alice-providers + providers: [ provideParent(AliceComponent) ] +// #enddocregion alice-providers +}) +// #docregion alice-class-signature +export class AliceComponent implements Parent +// #enddocregion alice-class-signature +{ + name= 'Alice'; +} +// #enddocregion alice + +////// Cathy /////////// +/** + * Show we can inject a parent by component type + */ +// #docregion cathy +@Component({ + selector: 'cathy', + template: ` +
+

Cathy

+ {{alex ? 'Found' : 'Did not find'}} Alex via the component class.
+
` +}) +export class CathyComponent { + constructor( @Optional() public alex: AlexComponent ) { } +} +// #enddocregion cathy + +///////// ParentFinder ////// +@Component({ + selector: 'parent-finder', + template: ` +

Parent Finder

+ + `, + directives: [ AlexComponent, AliceComponent ] +}) +export class ParentFinderComponent { } diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/runners-up.ts b/public/docs/_examples/cb-dependency-injection/ts/app/runners-up.ts new file mode 100644 index 0000000000..a2d79df35e --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/runners-up.ts @@ -0,0 +1,25 @@ +// #docplaster +// #docregion +import {OpaqueToken} from 'angular2/core'; +import {Hero} from './hero'; +import {HeroService} from './hero.service'; + +// #docregion runners-up +export const RUNNERS_UP = new OpaqueToken('RunnersUp'); +// #docregion runners-up + +// #docregion factory-synopsis +export function runnersUpFactory(take: number) { + return (winner: Hero, heroService: HeroService): string => { + /* ... */ +// #enddocregion factory-synopsis + return heroService + .getAllHeroes() + .filter((hero) => hero.name !== winner.name) + .map(hero => hero.name) + .slice(0, Math.max(0, take)) + .join(', '); +// #docregion factory-synopsis + }; +}; +// #enddocregion factory-synopsis diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/sorted-heroes.component.ts b/public/docs/_examples/cb-dependency-injection/ts/app/sorted-heroes.component.ts new file mode 100644 index 0000000000..2a45367044 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/sorted-heroes.component.ts @@ -0,0 +1,51 @@ +// #docplaster +// #docregion +import {Component, OnInit} from 'angular2/core'; +import {Hero} from './hero'; +import {HeroService} from './hero.service'; + +/////// HeroesBaseComponent ///// +// #docregion heroes-base, injection +@Component({ + selector: 'unsorted-heroes', + template: `
{{hero.name}}
`, + providers: [HeroService] +}) +export class HeroesBaseComponent implements OnInit { + constructor(private _heroService: HeroService) { } +// #enddocregion injection + + heroes: Array; + + ngOnInit() { + this.heroes = this._heroService.getAllHeroes(); + this._afterGetHeroes(); + } + + // Post-process heroes in derived class override. + protected _afterGetHeroes() {} + +// #docregion injection +} +// #enddocregion heroes-base,injection + +/////// SortedHeroesComponent ///// +// #docregion sorted-heroes +@Component({ + selector: 'sorted-heroes', + template: `
{{hero.name}}
`, + providers: [HeroService] +}) +export class SortedHeroesComponent extends HeroesBaseComponent { + constructor(heroService: HeroService) { + super(heroService); + } + + protected _afterGetHeroes() { + this.heroes = this.heroes.sort((h1, h2) => { + return h1.name < h2.name ? -1 : + (h1.name > h2.name ? 1 : 0); + }); + } +} +// #enddocregion sorted-heroes diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/user-context.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/user-context.service.ts new file mode 100644 index 0000000000..b241675d31 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/user-context.service.ts @@ -0,0 +1,32 @@ +// #docplaster +// #docregion +import {Injectable} from 'angular2/core'; +import {LoggerService} from './logger.service'; +import {UserService} from './user.service'; + +// #docregion injectables, injectable +@Injectable() +export class UserContextService { +// #enddocregion injectables, injectable + name:string; + role:string; + loggedInSince:Date; + + // #docregion ctor, injectables + constructor(private _userService:UserService, private _loggerService:LoggerService){ + // #enddocregion ctor, injectables + this.loggedInSince = new Date(); + // #docregion ctor, injectables + } + // #enddocregion ctor, injectables + + loadUser(userId:number){ + let user = this._userService.getUserById(userId); + this.name = user.name; + this.role = user.role; + + this._loggerService.logDebug('loaded User'); + } +// #docregion injectables, injectable +} +// #enddocregion injectables, injectable diff --git a/public/docs/_examples/cb-dependency-injection/ts/app/user.service.ts b/public/docs/_examples/cb-dependency-injection/ts/app/user.service.ts new file mode 100644 index 0000000000..f2d44d7a26 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/app/user.service.ts @@ -0,0 +1,10 @@ +// #docregion +import {Injectable} from 'angular2/core'; + +@Injectable() +export class UserService { + + getUserById(userId:number):any{ + return {name:'Bombasto',role:'Admin'}; + } +} \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/example-config.json b/public/docs/_examples/cb-dependency-injection/ts/example-config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cb-dependency-injection/ts/index.html b/public/docs/_examples/cb-dependency-injection/ts/index.html new file mode 100644 index 0000000000..66db40eb30 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/index.html @@ -0,0 +1,44 @@ + + + + + Dependency Injection + + + + + + + + + + + + + + + + + + + + + + + + + Loading app... + + + diff --git a/public/docs/_examples/cb-dependency-injection/ts/plnkr.json b/public/docs/_examples/cb-dependency-injection/ts/plnkr.json new file mode 100644 index 0000000000..d20b01cf1d --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/plnkr.json @@ -0,0 +1,9 @@ +{ + "description": "Dependency Injection", + "files":[ + "!**/*.d.ts", + "!**/*.js", + "!**/*.[1].*" + ], + "tags":["cookbook"] +} \ No newline at end of file diff --git a/public/docs/_examples/cb-dependency-injection/ts/sample.css b/public/docs/_examples/cb-dependency-injection/ts/sample.css new file mode 100644 index 0000000000..a8b59efd05 --- /dev/null +++ b/public/docs/_examples/cb-dependency-injection/ts/sample.css @@ -0,0 +1,26 @@ +.di-component{ + padding: 10px; + width:300px; + margin-bottom: 10px; +} +div[myHighlight] { + padding: 2px 8px; +} + +/* Parent Finder */ +.a, .b, .c { + margin: 6px 2px 6px; + padding: 4px 6px; +} +.a { + border: solid 2px black; +} +.b { + background: lightblue; + border: solid 1px darkblue; + display: flex; +} +.c { + background: pink; + border: solid 1px red; +} \ No newline at end of file diff --git a/public/docs/_examples/package.json b/public/docs/_examples/package.json index 73e8969a00..0c6772d3a2 100644 --- a/public/docs/_examples/package.json +++ b/public/docs/_examples/package.json @@ -4,7 +4,7 @@ "description": "Master package.json, the superset of all dependencies for all of the _example package.json files.", "main": "index.js", "scripts": { - "start": "concurrently \"npm run tsc:w\" \"npm run lite\" ", + "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ", "tsc": "tsc", "tsc:w": "tsc -w", "lite": "lite-server", diff --git a/public/docs/_examples/quickstart/ts/package.1.json b/public/docs/_examples/quickstart/ts/package.1.json index f399545abd..ad596c2088 100644 --- a/public/docs/_examples/quickstart/ts/package.1.json +++ b/public/docs/_examples/quickstart/ts/package.1.json @@ -2,7 +2,7 @@ "name": "angular2-quickstart", "version": "1.0.0", "scripts": { - "start": "concurrently \"npm run tsc:w\" \"npm run lite\" ", + "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ", "tsc": "tsc", "tsc:w": "tsc -w", "lite": "lite-server", diff --git a/public/docs/_examples/tslint.json b/public/docs/_examples/tslint.json new file mode 100644 index 0000000000..276453f4f5 --- /dev/null +++ b/public/docs/_examples/tslint.json @@ -0,0 +1,93 @@ +{ + "rules": { + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "indent": [ + true, + "spaces" + ], + "label-position": true, + "label-undefined": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + "static-before-instance", + "variables-before-functions" + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-key": true, + "no-duplicate-variable": true, + "no-empty": false, + "no-eval": true, + "no-inferrable-types": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unused-expression": true, + "no-unused-variable": true, + "no-unreachable": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ] + } +} diff --git a/public/docs/dart/latest/cookbook/_data.json b/public/docs/dart/latest/cookbook/_data.json index 4d4757ee57..ce8315d497 100644 --- a/public/docs/dart/latest/cookbook/_data.json +++ b/public/docs/dart/latest/cookbook/_data.json @@ -17,7 +17,13 @@ "intro": "Share information between different directives and components" }, - "dynamic-form": { + "dependency-injection": { + "title": "Dependency Injection", + "intro": "Techniques for Dependency Injection", + "hide": true + }, + + "dynamic-forms": { "title": "Dynamic Form", "intro": "Render dynamic forms with NgFormModel", "hide": true diff --git a/public/docs/dart/latest/cookbook/dependency-injection.jade b/public/docs/dart/latest/cookbook/dependency-injection.jade new file mode 100644 index 0000000000..f8df2a84a6 --- /dev/null +++ b/public/docs/dart/latest/cookbook/dependency-injection.jade @@ -0,0 +1 @@ +!= partial("../../../_includes/_ts-temp") \ No newline at end of file diff --git a/public/docs/js/latest/cookbook/_data.json b/public/docs/js/latest/cookbook/_data.json index dc91a7b4a2..a2040caccf 100644 --- a/public/docs/js/latest/cookbook/_data.json +++ b/public/docs/js/latest/cookbook/_data.json @@ -16,10 +16,14 @@ "intro": "Share information between different directives and components" }, - "dynamic-form": { + "dependency-injection": { + "title": "Dependency Injection", + "intro": "Techniques for Dependency Injection" + }, + + "dynamic-forms": { "title": "Dynamic Form", - "intro": "Render dynamic forms with NgFormModel", - "hide": true + "intro": "Render dynamic forms with NgFormModel" }, "ts-to-js": { diff --git a/public/docs/js/latest/cookbook/dependency-injection.jade b/public/docs/js/latest/cookbook/dependency-injection.jade new file mode 100644 index 0000000000..f8df2a84a6 --- /dev/null +++ b/public/docs/js/latest/cookbook/dependency-injection.jade @@ -0,0 +1 @@ +!= partial("../../../_includes/_ts-temp") \ No newline at end of file diff --git a/public/docs/ts/latest/cookbook/_data.json b/public/docs/ts/latest/cookbook/_data.json index fe2f7b8954..e4363318ef 100644 --- a/public/docs/ts/latest/cookbook/_data.json +++ b/public/docs/ts/latest/cookbook/_data.json @@ -16,6 +16,11 @@ "intro": "Share information between different directives and components" }, + "dependency-injection": { + "title": "Dependency Injection", + "intro": "Techniques for Dependency Injection" + }, + "dynamic-form": { "title": "Dynamic Form", "intro": "Render dynamic forms with NgFormModel" diff --git a/public/docs/ts/latest/cookbook/dependency-injection.jade b/public/docs/ts/latest/cookbook/dependency-injection.jade new file mode 100644 index 0000000000..c5fdcd0a7c --- /dev/null +++ b/public/docs/ts/latest/cookbook/dependency-injection.jade @@ -0,0 +1,908 @@ +include ../_util-fns + +:marked + Dependency Injection is a powerful pattern for managing code dependencies. + In this cookbook we will explore many of the features of Dependency Injection (DI) in Angular. + + +:marked + ## Table of contents + + [Application-wide dependencies](#app-wide-dependencies) + + [External module configuration](#external-module-configuration) + + [*@Injectable* and nested service dependencies](#nested-dependencies) + + [Limit service scope to a component subtree](#service-scope) + + [Multiple service instances (sandboxing)](#multiple-service-instances) + + [Qualify dependency lookup with *@Optional* and *@Host*](#qualify-dependency-lookup) + + [Inject the component's DOM element](#component-element) + + [Define dependencies with providers](#providers) + * [The *provide* function](#provide) + * [useValue - the *value provider*](#usevalue) + * [useClass - the *class provider*](#useclass) + * [useExisting - the *alias provider*](#useexisting) + * [useFactory - the *factory provider*](#usefactory) + + [Provider token alternatives](#tokens) + * [class-interface](#class-interface) + * [OpaqueToken](#opaque-token) + + [Inject into a derived class](#di-inheritance) + + [Find a parent component by injection](#find-parent) + * [Find parent with a known component type](#known-parent) + * [Cannot find a parent by its base class](#base-parent) + * [Find a parent by its class-interface](#class-interface-parent) + * [Find a parent in a tree of parents (*@SkipSelf*)](#parent-tree) + * [A *provideParent* helper function](#provideparent) + + [Break circularities with a forward class reference (*forwardRef*)](#forwardref) + +:marked + **See the [live example](/resources/live-examples/cb-dependency-injection/ts/plnkr.html)** + of the code supporting this cookbook. + +.l-main-section + + +:marked + ## Application-wide dependencies + Register providers for dependencies used throughout the application in the root application component, `AppComponent`. + + In the following example, we import and register several services + (the `LoggerService`, `UserContext`, and the `UserService`) + in the `@Component` metadata `providers` array. + ++makeExample('cb-dependency-injection/ts/app/app.component.ts','import-services','app/app.component.ts (excerpt)')(format='.') +:marked + All of these services are implemented as classes. + Service classes can act as their own providers which is why listing them in the `providers` array + is all the registration we need. +.l-sub-section + :marked + A *provider* is something that can create or deliver a service. + Angular creates a service instance from a class provider by "new-ing" it. + Learn more about providers [below](#providers). +:marked + Now that we've registered these services, + Angular can inject them into the constructor of *any* component or service, *anywhere* in the application. ++makeExample('cb-dependency-injection/ts/app/hero-bios.component.ts','ctor','app/hero-bios.component.ts (component constructor injection)')(format='.') + ++makeExample('cb-dependency-injection/ts/app/user-context.service.ts','ctor','app/user-context.service.ts (service constructor injection)')(format='.') + + +.l-main-section +:marked + ## External module configuration + We can register _certain_ module providers when bootstrapping rather than in the root application component. + + We'd do this when we expect to select or configure external modules that support our application + but (a) aren't conceptually part of the application and (b) that we could change later without + altering the essential logic of the application. + + For example, we might configure the Component Router with different + [location strategies](../guide/router.html#location-strategy) based on environmental factors. + The choice of location strategy doesn't matter to the application itself. + + We could sneak in a fake HTTP backend with sample data during development rather than + allow http calls to a remote server (that might not yet exist). + We'll switch to the real backend in production. + The application shouldn't know or care one way or the other. + + See both examples in the following `main.ts` + where we list their service providers in an array in the second parameter of the `bootstrap` method. + ++makeExample('cb-dependency-injection/ts/app/main.ts','bootstrap','app/main.ts')(format='.') + +a(id="injectable") +a(id="nested-dependencies") +.l-main-section +:marked + ## *@Injectable* and nested service dependencies + The consumer of an injected service does not know how to create that service. + It shouldn't care. + It's the dependency injection's job to create and cache that service. + + Sometimes a service depends on other services ... which may depend on yet other services. + Resolving these nested dependencies in the correct order is also the framework's job. + At each step, the consumer of dependencies simply declares what it requires in its constructor and the framework takes over. + + For example, we inject both the `LoggerService` and the `UserContext` in the `AppComponent`. ++makeExample('cb-dependency-injection/ts/app/app.component.ts','ctor','app/app.component.ts')(format='.') + +:marked + The `UserContext` in turn has dependencies on both the `LoggerService` (again) and + a `UserService` that gathers information about a particular user. + ++makeExample('cb-dependency-injection/ts/app/user-context.service.ts','injectables','user-context.service.ts (injection)')(format='.') + +:marked + When Angular creates an`AppComponent`, the dependency injection framework creates an instance of the `LoggerService` and + starts to create the `UserContextService`. + The `UserContextService` needs the `LoggerService`, which the framework already has, and the `UserService`, which it has yet to create. + The `UserService` has no dependencies so the dependency injection framework can just `new` one into existence. + + The beauty of dependency injection is that the author of `AppComponent` didn't care about any of this. + The author simply declared what was needed in the constructor (`LoggerService` and `UserContextService`) and the framework did the rest. + + Once all the dependencies are in place, the `AppComponent` displays the user information: + +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/logged-in-user.png" alt="Logged In User") +:marked + ### *@Injectable()* + Notice the `@Injectable()`decorator on the `UserContextService` class. ++makeExample('cb-dependency-injection/ts/app/user-context.service.ts','injectable','user-context.service.ts (@Injectable)')(format='.') +:marked + That decorator makes it possible for Angular to identify the types of its two dependencies, `LoggerService` and `UserService`. + + Technically, the `@Injectable()`decorator is only _required_ for a service class that has _its own dependencies_. + The `LoggerService` doesn't depend on anything. The logger would work if we omitted `@Injectable()` + and the generated code would be slightly smaller. + + But the service would break the moment we gave it a dependency and we'd have to go back and + and add `@Injectable()` to fix it. We add `@Injectable()` from the start for the sake of consistency and to avoid future pain. + +.alert.is-helpful + :marked + Although we recommend applying `@Injectable` to all service classes, do not feel bound by it. + Some developers prefer to add it only where needed and that's a reasonable policy too. + +.l-sub-section + :marked + The `AppComponent` class had two dependencies as well but no `@Injectable()`. + It didn't need `@Injectable()` because that component class has the `@Component` decorator. + In Angular with TypeScript, a *single* decorator — *any* decorator — is sufficient to identify dependency types. + + + +.l-main-section +:marked + ## Limit service scope to a component subtree + + All injected service dependencies are singletons meaning that, + for a given dependency injector ("injector"), there is only one instance of service. + + But an Angular application has multiple dependency injectors, arranged in a tree hierarchy that parallels the component tree. + So a particular service can be *provided* (and created) at any component level and multiple times + if provided in multiple components. + + By default, a service dependency provided in one component is visible to all of its child components and + Angular injects the same service instance into all child components that ask for that service. + + Accordingly, dependencies provided in the root `AppComponent` can be injected into *any* component *anywhere* in the application. + + That isn't always desireable. + Sometimes we want to restrict service availability to a particular region of the application. + + We can limit the scope of an injected service to a *branch* of the application hierarchy + by providing that service *at the sub-root component for that branch*. + Here we provide the `HeroService` to the `HeroesBaseComponent` by listing it in the `providers` array: ++makeExample('cb-dependency-injection/ts/app/sorted-heroes.component.ts','injection','app/sorted-heroes.component.ts (HeroesBaseComponent excerpt)') +:marked + When Angular creates the `HeroesBaseComponent`, it also creates a new instance of `HeroService` + that is visible only to the component and its children (if any). + + We could also provide the `HeroService` to a *different* component elsewhere in the application. + That would result in a *different* instance of the service, living in a *different* injector. +.l-sub-section + :marked + We examples of such scoped `HeroService` singletons appear throughout the accompanying sample code, + including the `HeroBiosComponent`, `HeroOfTheMonthComponent`, and `HeroesBaseComponent`. + Each of these components has its own `HeroService` instance managing its own independent collection of heroes. + +.l-main-section +.alert.is-helpful + :marked + ### Take a break! + This much Dependency Injection knowledge may be all that many Angular developers + ever need to build their applications. It doesn't always have to be more complicated. + + +.l-main-section +:marked + ## Multiple service instances (sandboxing) + + Sometimes we want multiple instances of a service at *the same level of the component hierarchy*. + + A good example is a service that holds state for its companion component instance. + We need a separate instance of the service for each component. + Each service has its own work-state, isolated from the service-and-state of a different component. + We call this *sandboxing* because each service and component instance has its own sandbox to play in. + + + Imagine a `HeroBiosComponent` that presents three instances of the `HeroBioComponent`. ++makeExample('cb-dependency-injection/ts/app/hero-bios.component.ts','simple','ap/hero-bios.component.ts') +:marked + Each `HeroBioComponent` can edit a single hero's biography. + A `HeroBioComponent` relies on a `HeroCacheService` to fetch, cache, and perform other persistence operations on that hero. ++makeExample('cb-dependency-injection/ts/app/hero-cache.service.ts','service','app/hero-cache.service.ts') +:marked + Clearly the three instances of the `HeroBioComponent` can't share the same `HeroCacheService`. + They'd be competing with each other to determine which hero to cache. + + Each `HeroBioComponent` gets its *own* `HeroCacheService` instance + by listing the `HeroCacheService` in its metadata `providers` array. ++makeExample('cb-dependency-injection/ts/app/hero-bio.component.ts','component','app/hero-bio.component.ts') +:marked + The parent `HeroBiosComponent` binds a value to the `heroId`. + The `ngOnInit` pass that `id` to the service which fetches and caches the hero. + The getter for the `hero` property pulls the cached hero from the service. + And the template displays this data-bound property. + + Find this example in [live code](/resources/live-examples/cb-dependency-injection/ts/plnkr.html) + and confirm that the three `HeroBioComponent` instances have their own cached hero data. +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/hero-bios.png" alt="Bios") + +a(id="optional") +a(id="qualify-dependency-lookup") +.l-main-section +:marked + ## Qualify dependency lookup with *@Optional* and *@Host* + We learned that dependencies can be registered at any level in the component hierarchy. + + When a component requests a dependency, Angular starts with that component's injector and walks up the injector tree + until it finds the first suitable provider. Angular throws an error if it can't find the dependency during that walk. + + We *want* this behavior most of the time. + But sometimes we need to limit the search and/or accommodate a missing dependency. + We can modify Angular's search behavior with the `@Host` and `@Optional` qualifying decorators, + used individually or together. + + The `@Optional` decorator tells Angular to continue when it can't find the dependency. + Angular sets the injection parameter to `null` instead. + + The `@Host` decorator stops the upward search at the *host component*. + + The host component is typically the component requesting the dependency. + But when this component is projected into a *parent* component, that parent component becomes the host. + We look at this second, more interesting case in our next example. + + ### Demonstration + The `HeroBiosAndContactsComponent` is a revision of the `HeroBiosComponent` that we looked at [above](#hero-bios-component). ++makeExample('cb-dependency-injection/ts/app/hero-bios.component.ts','hero-bios-and-contacts','app/hero-bios.component.ts (HeroBiosAndContactsComponent)') +:marked + Focus on the template: ++makeExample('cb-dependency-injection/ts/app/hero-bios.component.ts','template')(format='.') +:marked + We've inserted a `` element between the `` tags. + Angular *projects* (*transcludes*) the corresponding `HeroContactComponent` into the `HeroBioComponent` view, + placing it in the `` slot of the `HeroBioComponent` template: ++makeExample('cb-dependency-injection/ts/app/hero-bio.component.ts','template','app/hero-bio.component.ts (template)')(format='.') +:marked + It looks like this, with the heroe's telephone number from `HeroContactComponent` projected above the hero description: +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/hero-bio-and-content.png" alt="bio and contact") +:marked + Here's the `HeroContactComponent` which demonstrates the qualifying decorators that we're talking about in this section: ++makeExample('cb-dependency-injection/ts/app/hero-contact.component.ts','component','app/hero-contact.component.ts') +:marked + Focus on the constructor parameters ++makeExample('cb-dependency-injection/ts/app/hero-contact.component.ts','ctor-params','app/hero-contact.component.ts')(format='.') +:marked + The `@Host()` function decorating the `_heroCache` property ensures that + we get a reference to the cache service from the parent `HeroBioComponent`. + Angular throws if the parent lacks that service, even if a component higher in the component tree happens to have that service. + + A second `@Host()` function decorates the `_loggerService` property. + We know the only `LoggerService` instance in the app is provided at the `AppComponent` level. + The host `HeroBioComponent` doesn't have its own `LoggerService` provider. + + Angular would throw an error if we hadn't also decorated the property with the `@Optional()` function. + Thanks to `@Optional()`, Angular sets the `loggerService` to null and the rest of the component adapts. + +.l-sub-section + :marked + We'll come back to the `elementRef` property shortly. +:marked + Here's the `HeroBiosAndContactsComponent` in action. +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/hero-bios-and-contacts.png" alt="Bios with contact into") +:marked + If we comment out the `@Host()` decorator, Angular now walks up the injector ancestor tree + until it finds the logger at the `AppComponent` level. The logger logic kicks in and the hero display updates + with the gratuituous "!!!", indicating that the logger was found. +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/hero-bio-contact-no-host.png" alt="Without @Host") +:marked + On the other hand, if we restore the `@Host()` decorator and comment out `@Optional`, + the application fails for lack of the required logger at the host component level. +
+ `EXCEPTION: No provider for LoggerService! (HeroContactComponent -> LoggerService)` + + +:marked + ## Inject the component's element + + On occasion we might need to access a component's corresponding DOM element. + Although we strive to avoid it, many visual effects and 3rd party tools (such as jQuery) + require DOM access. + + To illustrate, we've written a simplified version of the `HighlightDirective` from + the [Attribute Directives](../guide/attribute-directives.html) chapter. ++makeExample('cb-dependency-injection/ts/app/highlight.directive.ts','','app/highlight.directive.ts') +:marked + The directive sets the background to a highlight color when the user mouses over the + DOM element to which it is applied. + + Angular set the constructor's `el` parameter to the injected `ElementRef` which is + a wrapper around that DOM element. + Its `nativeElement` property exposes the DOM element for the directive to manipulate. + + The sample code applies the directive's `myHighlight` attribute to two `
` tags, + first without a value (yielding the default color) and then with an assigned color value. ++makeExample('cb-dependency-injection/ts/app/app.component.html','highlight','app/app.component.html (highlight)')(format='.') +:marked + The following image shows the effect of mousing over the `` tag. +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/highlight.png" alt="Highlighted bios") +:marked + + +.l-main-section +:marked + ## Define dependencies with providers + + In this section we learn to write providers that deliver dependent services. + + ### Background + We get a service from a dependency injector by giving it a ***token***. + + We usually let Angular handle this transaction for us by specifying a constructor parameter and its type. + The parameter type serves as the injector lookup *token*. + Angular passes this token to the injector and assigns the result to the parameter. + Here's a typical example: + ++makeExample('cb-dependency-injection/ts/app/hero-bios.component.ts','ctor','app/hero-bios.component.ts (component constructor injection)')(format='.') +:marked + Angular asks the injector for the service associated with the `LoggerService` and + and assigns the returned value to the `logger` parameter. + + Where did the injector get that value? + It may already have that value in its internal container. + It it doesn't, it may be able to make one with the help of a ***provider***. + A *provider* is a recipe for delivering a service associated with a *token*. +.l-sub-section + :marked + If the injector doesn't have a provider for the requested *token*, it delegates the request + to its parent injector, where the process repeats until there are no more injectors. + If the search is futile, the injector throws an error ... unless the request was [optional](#optional). + + Let's return our attention to providers themselves. +:marked + A new injector has no providers. + Angular initializes the injectors it creates with some providers it cares about. + We have to register our _own_ application providers manually, + usually in the `providers` array of the `Component` or `Directive` metadata: ++makeExample('cb-dependency-injection/ts/app/app.component.ts','providers','app/app.component.ts (providers)') +:marked + ### Defining providers + + The simple class provider is the most typical by far. + We mention the class in the `providers` array and we're done. ++makeExample('cb-dependency-injection/ts/app/hero-bios.component.ts','class-provider','app/hero-bios.component.ts (class provider)')(format='.') +:marked + It's that simple because the most common injected service is an instance of a class. + But not every dependency can be satisfied by creating a new instance of a class. + We need other ways to deliver dependency values and that means we need other ways to specify a provider. + + The `HeroOfTheMonthComponent` example demonstrates many of the alternatives and why we need them. + +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/hero-of-month.png" alt="Hero of the month" width="300px") +:marked + It's visually simple: a few properties and the output of a logger. The code behind it gives us plenty to talk about. ++makeExample('cb-dependency-injection/ts/app/hero-of-the-month.component.ts','hero-of-the-month','hero-of-the-month.component.ts') + +.l-main-section +a(id='provide') +:marked + #### The *provide* function + + The imported Angular `provide` function creates an instance of + the Angular [Provider](../api/core/Provider-class.html) class. + + The `provide` function takes a *token* and a *definition object*. + The *token* is usually a class but [it doesn't have to be](#tokens). + + The *definition* object has one main property, (e.g. `useValue`) that indicates how the provider + should create or return the provided value. + +.l-main-section +a(id='usevalue') +:marked + #### useValue - the *value provider* + + Set the `useValue` property to a ***fixed value*** that the provider can return as the dependency object. + + Use this technique to provide *runtime configuration constants* such as web-site base addresses and feature flags. + We often use a *value provider* in a unit test to replace a production service with a fake or mock. + + The `HeroOfTheMonthComponent` example has two *value providers*. + The first provides an instance of the `Hero` class; + the second specifies a literal string resource: ++makeExample('cb-dependency-injection/ts/app/hero-of-the-month.component.ts','use-value')(format='.') +:marked + The `Hero` provider token is a class which makes sense because the value is a `Hero` + and the consumer of the injected hero would want the type information. + + The `TITLE` provider token is *not a class*. + It's a special kind of provider lookup key called an [OpaqueToken](#opaquetoken). + We often use an `OpaqueToken` when the dependency is a simple value like a string, a number, or a function. + + The value of a *value provider* must be defined *now*. We can't create the value later. + Obviously the title string literal is immediately available. + The `someHero` variable in this example was set earlier in the file: ++makeExample('cb-dependency-injection/ts/app/hero-of-the-month.component.ts','some-hero') +:marked + The other providers create their values *lazily* when they're needed for injection. + +.l-main-section +a(id='useclass') +:marked + #### useClass - the *class provider* + + The `useClass` provider creates and returns new instance of the specified class. + + Use this technique to ***substitute an alternative implementation*** for a common or default class. + The alternative could implement a different strategy, extend the default class, + or fake the behavior of the real class in a test case. + + We see two examples in the `HeroOfTheMonthComponent`: ++makeExample('cb-dependency-injection/ts/app/hero-of-the-month.component.ts','use-class')(format='.') +:marked + The first provider is the *de-sugared*, expanded form of the most typical case in which the + class to be created (`HeroService`) is also the provider's injection token. + We wrote it in this long form to de-mystify the preferred short form. + + The second provider substitutes the `DateLoggerService` for the `LoggerService`. + The `LoggerService` is already registered at the `AppComponent` level. + When _this component_ requests the `LoggerService`, it receives the `DateLoggerService` instead. +.l-sub-section + :marked + This component and its tree of child components receive the `DateLoggerService` instance. + Components outside the tree continue to receive the original `LoggerService` instance. +:marked + The `DateLoggerService` inherits from `LoggerService`; it appends the current date/time to each message: ++makeExample('cb-dependency-injection/ts/app/date-logger.service.ts','date-logger-service','app/date-logger.service.ts')(format='.') + +.l-main-section +a(id='useexisting') +:marked + #### useExisting - the *alias provider* + + The `useExisting` provider maps one token to another. + In effect, the first token is an ***alias*** for the service associated with second token, + creating ***two ways to access the same service object***. ++makeExample('cb-dependency-injection/ts/app/hero-of-the-month.component.ts','use-existing') +:marked + Narrowing an API through an aliasing interface is _one_ important use case for this technique. + We're aliasing for that very purpose here. + Imagine that the `LoggerService` had a large API (it's actually only three methods and a property). + We want to shrink that API surface to just the two members exposed by the `MinimalLogger` [*class-interface*](#class-interface): + ++makeExample('cb-dependency-injection/ts/app/date-logger.service.ts','minimal-logger','app/date-logger.service.ts (MinimalLogger)')(format='.') +:marked + The constructor's `logger` parameter is typed as `MinimalLogger` so only its two members are visible in TypeScript: +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/minimal-logger-intellisense.png" alt="MinimalLogger restricted API") +:marked + Angular actually sets the `logger` parameter to the injector's full version of the `LoggerService` + which happens to be the `DateLoggerService` thanks to the override provider registered previously via `useClass`. + The following image, which displays the logging date, confirms the point: +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/date-logger-entry.png" alt="DateLoggerService entry" width="300px") + +.l-main-section +a(id='usefactory') +:marked + #### useFactory - the *factory provider* + + The `useFactory` provider creates a dependency object by calling a factory function + as seen in this example. ++makeExample('cb-dependency-injection/ts/app/hero-of-the-month.component.ts','use-factory') +:marked + Use this technique to ***create a dependency object*** + with a factory function whose inputs are some ***combination of injected services and local state***. + + The *dependency object* doesn't have to be a class instance. It could be anything. + In this example, the *dependency object* is a string of the names of the runners-up + to the "Hero of the Month" contest. + + The local state is the number `2`, the number of runners-up this component should show. + We execute `runnersUpFactory` immediately with `2`. + + The `runnersUpFactory` itself isn't the provider factory function. + The true provider factory function is the function that `runnersUpFactory` returns. + ++makeExample('cb-dependency-injection/ts/app/runners-up.ts','factory-synopsis','runners-up.ts (excerpt)')(format='.') +:marked + That returned function takes a winning `Hero` and a `HeroService` as arguments. + + Angular supplies these arguments from injected values identified by + the two *tokens* in the `deps` array. + The two `deps` values are *tokens* that the injector uses + to provide these factory function dependencies. + + After some undisclosed work, the function returns the string of names + and Angular injects it into the `runnersUp` parameter of the `HeroOfTheMonthComponent`. + +.l-sub-section + :marked + The function retrieves candidate heroes from the `HeroService`, + takes `2` of them to be the runners-up, and returns their concatenated names. + Look at the [live example](/resources/live-examples/cb-dependency-injection/ts/plnkr.html) + for the full source code. + + +a(id="tokens") +.l-main-section +:marked + ## Provider token alternatives: the *class-interface* and *OpaqueToken* + + Angular dependency injection is easiest when the provider *token* is a class + that is also the type of the returned dependency object (what we usually call the *service*). + + But the token doesn't have to be a class and even when it is a class, + it doesn't have to be the same type as the returned object. + That's the subject of our next section. + + + ### class-interface + In the previous *Hero of the Month* example, we used the `MinimalLogger` class + as the token for a provider of a `LoggerService`. ++makeExample('cb-dependency-injection/ts/app/hero-of-the-month.component.ts','use-existing') +:marked + The `MinimalLogger` is an abstract class. ++makeExample('cb-dependency-injection/ts/app/date-logger.service.ts','minimal-logger')(format='.') +:marked + We usually inherit from an abstract class. + But `LoggerService` doesn't inherit from `MinimalLogger`. *No class* inherits from it. + Instead, we use it like an interface. + + Look again at the declaration for `DateLoggerService` ++makeExample('cb-dependency-injection/ts/app/date-logger.service.ts','date-logger-service-signature')(format='.') +:marked + `DateLoggerService` inherits (extends) from `LoggerService`, not `MinimalLogger`. + The `DateLoggerService` *implements* `MinimalLogger` as if `MinimalLogger` were an *interface*. + + We call a class used in this way a ***class-interface***. + The key benefit of a *class-interface* is that we can get the strong-typing of an interface + and we can ***use it as a provider token*** in the same manner as a normal class. + + A ***class-interface*** should define *only* the members that its consumers are allowed to call. + Such a narrowing interface helps decouple the concrete class from its consumers. + The `MinimalLogger` defines just two of the `LoggerClass` members. + +.l-sub-section + :marked + #### Why *MinimalLogger* is a class and not an interface + We can't use an interface as a provider token because + interfaces are not JavaScript objects. + They exist only in the TypeScript design space. + They disappear after the code is transpiled to JavaScript. + + A provider token must be a real JavaScript object of some kind: + a function, an object, a string ... a class. + + Using a class as an interface gives us the characteristics of an interface in a JavaScript object. + + The minimize memory cost, the class should have *no implementation*. + The `MinimalLogger` transpiles to this unoptimized, pre-minified JavaScript: + +makeExample('cb-dependency-injection/ts/app/date-logger.service.ts','minimal-logger-transpiled')(format='.') + :marked + It never grows larger no matter how many members we add *as long as they are typed but not implemented*. + +a(id='opaque-token') +:marked + ### OpaqueToken + + Dependency objects can be simple values like dates, numbers and strings or + shapeless objects like arrays and functions. + + Such objects don't have application interfaces and therefore aren't well represented by a class. + They're better represented by a token that is both unique and symbolic, + a JavaScript object that has a friendly name but won't conflict with + another token that happens to have the same name. + + The `OpaqueToken` has these characteristics. + We encountered them twice in the *Hero of the Month* example, + in the *title* value provider and in the *runnersUp* factory provider. ++makeExample('cb-dependency-injection/ts/app/hero-of-the-month.component.ts','provide-opaque-token')(format='.') +:marked + We created the `TITLE` token like this: ++makeExample('cb-dependency-injection/ts/app/hero-of-the-month.component.ts','opaque-token')(format='.') + + +a(id="di-inheritance") +.l-main-section +:marked + ## Inject into a derived class + We must take care when writing a component that inherits from another component. + If the base component has injected dependencies, + we must re-provide and re-inject them in the derived class + and then pass them down to the base class through the constructor. + + In this contrived example, `SortedHeroesComponent` inherits from `HeroesBaseComponent` + to display a *sorted* list of heroes. + +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/sorted-heroes.png" alt="Sorted Heroes") +:marked + The `HeroesBaseComponent` could stand on its own. + It demands its own instance of the `HeroService` to get heroes + and displays them in the order they arrive from the database. + ++makeExample('cb-dependency-injection/ts/app/sorted-heroes.component.ts','heroes-base','app/sorted-heroes.component.ts (HeroesBaseComponent)') +.l-sub-section + :marked + We strongly prefer simple constructors. They should do little more than initialize variables. + This rule makes the component safe to construct under test without fear that it will do something dramatic like talk to the server. + That's why we call the `HeroService` from within the `ngOnInit` rather than the constructor. + + We explain the mysterious `_afterGetHeroes` below. +:marked + Users want to see the heroes in alphabetical order. + Rather than modify the original component, we sub-class it and create a + `SortedHeroesComponent` that sorts the heroes before presenting them. + The `SortedHeroesComponent` lets the base class fetch the heroes. + (we said it was contrived). + + Unfortunately, Angular cannot inject the `HeroService` directly into the base class. + We must provide the `HeroService` again for *this* component, + then pass it down to the base class inside the constructor. + ++makeExample('cb-dependency-injection/ts/app/sorted-heroes.component.ts','sorted-heroes','app/sorted-heroes.component.ts (SortedHeroesComponent)') +:marked + Now take note of the `_afterGetHeroes` method. + Our first instinct was to create an `ngOnInit` method in `SortedHeroesComponent` and do the sorting there. + But Angular calls the *derived* class's `ngOnInit` *before* calling the base class's `ngOnInit` + so we'd be sorting the heroes array *before they arrived*. That produces a nasty error. + + Overriding the base class's `_afterGetHeroes` method solves the problem + + These complications argue for *avoiding component inheritance*. + +a(id="find-parent") +.l-main-section +:marked + ## Find a parent component by injection + + Application components often need to share information. + We prefer the more loosely coupled techniques such as data binding and service sharing. + But sometimes it makes sense for one component to have a direct reference to another component + perhaps to access values or call methods on that component. + + Obtaining a component reference is a bit tricky in Angular. + Although an Angular application is a tree of components, + there is no public API for inspecting and traversing that tree. + + There is an API for acquiring a child reference + (checkout `Query`, `QueryList`, `ViewChildren`, and `ContentChildren`). + + There is no public API for acquiring a parent reference. + But because every component instance is added to an injector's container, + we can use Angular dependency injection to reach a parent component. + + This section describes some techniques for doing that. + + + ### Find a parent component of known type + + We use standard class injection to acquire a parent component whose type we know. + + In the following example, the parent `AlexComponent` has several children including a `CathyComponent`: +a(id='alex') ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','alex-1','parent-finder.component.ts (AlexComponent v.1)')(format='.') +:marked + *Cathy* reports whether or not she has access to *Alex* + after injecting an `AlexComponent` into her constructor: ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','cathy','parent-finder.component.ts (CathyComponent)')(format='.') +:marked + We added the [@Optional](#optional) qualifier for safety but + the [live example](/resources/live-examples/cb-dependency-injection/ts/plnkr.html) + confirms that the `alex` parameter is set. + + + ### Cannot find a parent by its base class + + What if we do *not* know the concrete parent component class? + + A re-usable component might be a child of multiple components. + Imagine a component for rendering breaking news about a financial instrument. + For sound (cough) business reasons, this news component makes frequent calls + directly into its parent instrument as changing market data stream by. + + The app probably defines more than a dozen financial instrument components. + If we're lucky, they all implement the same base class + whose API our `NewsComponent` understands. + +.l-sub-section + :marked + Looking for components that implement an interface would be better. + That's not possible because TypeScript interfaces disappear from the transpiled JavaScript + which doesn't support interfaces. There's no artifact we could look for. +:marked + We're not claiming this is good design. + We are asking *can a component inject its parent via the parent's base class*? + + The sample's `CraigComponent` explores this question. [Looking back](#alex) + we see that the `Alex` component *extends* (*inherits*) from a class named `Base`. ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','alex-class-signature','parent-finder.component.ts (Alex class signature)')(format='.') +:marked + The `CraigComponent` tries to inject `Base` into its `alex` constructor parameter and reports if it succeeded. ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','craig','parent-finder.component.ts (CraigComponent)')(format='.') +:marked + Unfortunately, this does not work. + The [live example](/resources/live-examples/cb-dependency-injection/ts/plnkr.html) + confirms that the `alex` parameter is null. + *We cannot inject a parent by its base class.* + + + ### Find a parent by its class-interface + + We can find a parent component with a [class-interface](#class-interface). + + The parent must cooperate by providing an *alias* to itself in the name of a *class-interface* token. + + Recall that Angular always adds a component instance to its own injector; + that's why we could inject *Alex* into *Carol* [earlier](#known-parent). + + We write an [*alias provider*](#useexisting) — a `provide` function with a `useExisting` definition — + that creates an *alternative* way to inject the same component instance + and add that provider to the `providers` array of the `@Component` metadata for the `AlexComponent`: +a(id="alex-providers") ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','alex-providers','parent-finder.component.ts (AlexComponent providers)')(format='.') +:marked + [Parent](#parent-token) is the provider's *class-interface* token. + The [*forwardRef*](#forwardref) breaks the circular reference we just created by having the `AlexComponent` refer to itself. + + *Carol*, the third of *Alex*'s child components, injects the parent into its `parent` parameter, the same way we've done it before: ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','carol-class','parent-finder.component.ts (CarolComponent class)')(format='.') +:marked + Here's *Alex* and family in action: +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/alex.png" alt="Alex in action") + +a(id="parent-tree") +:marked + ### Find the parent in a tree of parents + + Imagine one branch of a component hierarchy: *Alice* -> *Barry* -> *Carol*. + Both *Alice* and *Barry* implement the `Parent` *class-interface*. + + *Barry* is the problem. He needs to reach his parent, *Alice*, and also be a parent to *Carol*. + That means he must both *inject* the `Parent` *class-interface* to get *Alice* and + *provide* a `Parent` to satisfy *Carol*. + + Here's *Barry*: ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','barry','parent-finder.component.ts (BarryComponent)')(format='.') +:marked + *Barry*'s `providers` array looks just like [*Alex*'s](#alex-providers). + If we're going to keep writing [*alias providers*](#useexisting) like this we should create a [helper function](#provideparent). + + For now, focus on *Barry*'s constructor: ++makeTabs( + 'cb-dependency-injection/ts/app/parent-finder.component.ts, cb-dependency-injection/ts/app/parent-finder.component.ts', + 'barry-ctor, carol-ctor', + 'Barry\'s constructor, Carol\'s constructor')(format='.') +:marked +:marked + It's identical to *Carol*'s constructor except for the additional `@SkipSelf` decorator. + + `@SkipSelf` is essential for two reasons: + + 1. It tell the injector to start its search for a `Parent` dependency in a component *above* itself, + which *is* what parent means. + + 2. Angular throws a cyclic dependency error if we omit the `@SkipSelf` decorator. + + `Cannot instantiate cyclic dependency! (BethComponent -> Parent -> BethComponent)` + + Here's *Alice*, *Barry* and family in action: + +figure.image-display + img(src="/resources/images/cookbooks/dependency-injection/alice.png" alt="Alice in action") + +a(id="parent-token") +:marked + ### The *Parent* class-interface + We [learned earlier](#class-interface) that a *class-interface* is an abstract class used as an interface rather than as a base class. + + Our example defines a `Parent` *class-interface* . ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','parent','parent-finder.component.ts (Parent class-interface)')(format='.') +:marked + The `Parent` *class-interface* defines a `name` property with a type declaration but *no implementation*., + The `name` property is the only member of a parent component that a child component can call. + Such a narrowing interface helps decouple the child component class from its parent components. + + A component that could serve as a parent *should* implement the *class-interface* as the `AliceComponent` does: ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','alice-class-signature','parent-finder.component.ts (AliceComponent class signature)')(format='.') +:marked + Doing so adds clarity to the code. But it's not technically necessary. + Although the `AlexComponent` has a `name` property (as required by its `Base` class) + its class signature doesn't mention `Parent`: ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','alex-class-signature','parent-finder.component.ts (AlexComponent class signature)')(format='.') +.l-sub-section + :marked + The `AlexComponent` *should* implement `Parent` as a matter of proper style. + It doesn't in this example *only* to demonstrate that the code will compile and run without the interface + +a(id="provideparent") +:marked + ### A *provideParent* helper function + + Writing variations of the same parent *alias provider* gets old quickly, + especially this awful mouthful with a [*forwardRef*](#forwardref): ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','alex-providers')(format='.') +:marked + We can extract that logic into a helper function like this: ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','provide-the-parent')(format='.') +:marked + Now we can add a simpler, more meaningful parent provider to our components: ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','alice-providers')(format='.') +:marked + We can do better. The current version of the helper function can only alias the `Parent` *class-interface*. + Our application might have a variety of parent types, each with its own *class-interface* token. + + Here's a revised version that defaults to `parent` but also accepts an optional second parameter for a different parent *class-interface*. ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','provide-parent')(format='.') +:marked + And here's how we could use it with a different parent type: ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','beth-providers')(format='.') +:marked + +a(id="forwardref") +.l-main-section +:marked + ## Break circularities with a forward class reference (*forwardRef*) + + The order of class declaration matters in TypeScript. + We can't refer directly to a class until it's been defined. + + This isn't usually a problem, especially if we adhere to the recommended *one class per file* rule. + But sometimes circular references are unavoidable. + We're in a bind when class 'A refers to class 'B' and 'B' refers to 'A'. + One of them has to be defined first. + + The Angular `forwardRef` function creates an *indirect* reference that Angular can resolve later. + + The *Parent Finder* sample is full of circular class references that are impossible to break. + + In the [*Alex/Cathy* example](#known-parent) above: + + * the `AlexComponent` lists the `CathyComponent` in its component metadata `directives` array + so it can display *Cathy* in its template. + + * the `CathyComponent` constructor injects the parent `AlexComponent` which means that the `alex` parameter + of its constructor has the `AlexComponent` type. + + *Alex* refers to *Cathy* and *Cathy* refers to *Alex*. We're stuck. We must define one of them first. + + We defined *Alex* first and built its `C_DIRECTIVES` array with a forward reference to *Cathy*: ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','C_DIRECTIVES','parent-finder.component.ts (C_DIRECTIVES)')(format='.') +:marked +.l-sub-section + :marked + Defining *Alex* and *Cathy* in separate files won't help. + *Alex* would have to import *Cathy* and *Cathy* would have to import *Alex*. + + We *had* to define *Alex* first because, + while we can add `forwardRef(CathyComponent)` to *Alex*'s `directives` array, + we can't write `public alex: forwardRef(AlexComponent))` in *Cathy*'s constructor. +:marked + We face a similar dilemma when a class makes *a reference to itself* + as does the `AlexComponent` in its `providers` array. + The `providers` array is a property of the `@Component` decorator function which must + appear *above* the class definition. + + Again we break the circularity with `forwardRef`: ++makeExample('cb-dependency-injection/ts/app/parent-finder.component.ts','alex-providers','parent-finder.component.ts (AlexComponent providers)')(format='.') +:marked diff --git a/public/docs/ts/latest/guide/attribute-directives.jade b/public/docs/ts/latest/guide/attribute-directives.jade index b9bc22fcf9..7452ac19c8 100644 --- a/public/docs/ts/latest/guide/attribute-directives.jade +++ b/public/docs/ts/latest/guide/attribute-directives.jade @@ -186,12 +186,9 @@ figure.image-display Now we implement those two mouse event handlers: +makeExample('attribute-directives/ts/app/highlight.directive.2.ts','mouse-methods')(format=".") :marked - Notice that they delegate to a helper method to set the color. - - We no longer need the constructor body but - we still want the injected `ElementRef`. - We revise the constructor signature to capture the injected `ElementRef` in a private variable - and clear the body. + Notice that they delegate to a helper method that sets the color via a private local variable, `_el`. + We revise the constructor to capture the `ElementRef.nativeElement` in `_el`. + +makeExample('attribute-directives/ts/app/highlight.directive.2.ts','ctor')(format=".") :marked Here's the updated directive: diff --git a/public/docs/ts/latest/guide/dependency-injection.jade b/public/docs/ts/latest/guide/dependency-injection.jade index d34df913d2..72b7ed695c 100644 --- a/public/docs/ts/latest/guide/dependency-injection.jade +++ b/public/docs/ts/latest/guide/dependency-injection.jade @@ -411,13 +411,18 @@ include ../_util-fns - var decorated = lang == 'dart' ? 'annotated' : 'decorated' - var any_decorator = lang == 'dart' ? '' : 'TypeScript generates metadata for any class with a decorator, and any decorator will do.' .callout.is-helpful - header Always add @Injectable() + header Suggestion: add @Injectable() to every service class :marked We recommend adding `@Injectable()` to every service class, even those that don't have dependencies and, therefore, do not technically require it. Here's why: ul(style="font-size:inherit") li Future proofing: No need to remember @Injectable() when we add a dependency later. li Consistency: All services follow the same rules, and we don't have to wonder why #{a_decorator} is missing. + + :marked + Although we recommend applying `@Injectable` to all service classes, do not feel bound by it. + Some developers prefer to add it only where needed and that's a reasonable policy too. + .l-sub-section :marked The `HeroesComponent` has an injected dependency too. Why don't we add `@Injectable()` to the `HeroesComponent`? diff --git a/public/docs/ts/latest/guide/pipes.jade b/public/docs/ts/latest/guide/pipes.jade index 54b0401aa9..42abb48a7e 100644 --- a/public/docs/ts/latest/guide/pipes.jade +++ b/public/docs/ts/latest/guide/pipes.jade @@ -312,8 +312,7 @@ figure.image-display +makeExample('pipes/ts/app/flying-heroes.pipe.ts','filter')(format='.') We can derive a `FlyingHeroesImpureComponent` that we derive from the `FlyingHeroesComponent`. -+makeExample('pipes/ts/app/flying-heroes.component.ts','impure-component', -'app/flying-heroes.component.ts (FlyingHeroesImpureComponent)')(format='.') ++makeExample('pipes/ts/app/flying-heroes.component.ts','impure-component','app/flying-heroes.component.ts (FlyingHeroesImpureComponent)')(format='.') :marked The only substantive change is the pipe. We can confirm in the [live example](/resources/live-examples/pipes/ts/plnkr.html) diff --git a/public/docs/ts/latest/guide/router.jade b/public/docs/ts/latest/guide/router.jade index cec2c638bb..594d2d467a 100644 --- a/public/docs/ts/latest/guide/router.jade +++ b/public/docs/ts/latest/guide/router.jade @@ -1386,9 +1386,10 @@ code-example(format="." language="bash"). `HeroService` and (perhaps) mocking it. + .l-main-section :marked - ## Appendix: Browser URL styles + ## Appendix: *LocationStrategy* and browser URL styles When the router navigates to a new component view, it updates the browser's location and history with a URL for that view. diff --git a/public/resources/images/cookbooks/dependency-injection/alex.png b/public/resources/images/cookbooks/dependency-injection/alex.png new file mode 100644 index 0000000000000000000000000000000000000000..06a9762024835f6924f99c2084cd80197eda6886 GIT binary patch literal 20533 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 AZU6uP literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/alice.png b/public/resources/images/cookbooks/dependency-injection/alice.png new file mode 100644 index 0000000000000000000000000000000000000000..48d311b37fe5fc38a7a6d9fb3234d351d78b5cfb GIT binary patch literal 46898 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ð_ZfzQ%O;8WOjZZ9d#E#0 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%0DQh0XEuPpw}}jZ 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 a$wuJL@m`6|$O{krs472KDuKNI@V@}2{HKcm literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/date-logger-entry.png b/public/resources/images/cookbooks/dependency-injection/date-logger-entry.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7c9953c3458545d1426921c636e6ab6d2e91f2 GIT binary patch literal 10087 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 literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/hero-bios-and-contacts.png b/public/resources/images/cookbooks/dependency-injection/hero-bios-and-contacts.png new file mode 100644 index 0000000000000000000000000000000000000000..9b196cbd0bfe0abb835b1fd094e9538e5a1f9368 GIT binary patch literal 29600 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 SPA;NUvYuvZb#}_i?f(Y(pnuo^ literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/hero-bios.png b/public/resources/images/cookbooks/dependency-injection/hero-bios.png new file mode 100644 index 0000000000000000000000000000000000000000..df3fd2140db87f77c84b5e79d5cc136f8ea37eb6 GIT binary patch literal 16720 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 RHse3Zl;qXqvShB_`Cltoqz3>1 literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/hero-of-month.png b/public/resources/images/cookbooks/dependency-injection/hero-of-month.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d485df3edb36fad43dccd46f33e1e89d67db72 GIT binary patch literal 26538 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 literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/logged-in-user.png b/public/resources/images/cookbooks/dependency-injection/logged-in-user.png new file mode 100644 index 0000000000000000000000000000000000000000..4a43da33c9d70ba785b998a2c6076520ed2fc656 GIT binary patch literal 8274 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 c0O1A2J;Dje0Y6~z>% literal 0 HcmV?d00001 diff --git a/public/resources/images/cookbooks/dependency-injection/minimal-logger-intellisense.png b/public/resources/images/cookbooks/dependency-injection/minimal-logger-intellisense.png new file mode 100644 index 0000000000000000000000000000000000000000..1f02db8d7673310839c7bc80037d8a466749fbab GIT binary patch literal 15037 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

MP}+6ILoFT9Pp* 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 P2_qw^AWR69NPX5;QnTqrn{#JZNyY;2P}a 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 JtX6