KEMBAR78
Angular 2.0 Dependency injection | PPTX
import {Injectable,Injector} from '@angular/core';
@Injectable() class Engine {}
@Injectable() class Car { constructor(public engine:Engine) {} }
var injector = Injector.resolveAndCreate([Car, Engine]);
var car = injector.get(Car);
Injector
FactoryFn
Token Flags
Token
Provider
Dependency
injectables
function createComponentInjector(parent, proto) {
return new Injector(proto, parent);
}
The created object does not get cached by the injector.
A
Parent Injector
A,B,C
Child Injector
A,B
Child Injector
A
B C
@Injectable()
class A{
constructor(b:B,c:C){ //... }
}
@NgModule({
declarations:[AppComponent, ... ],
providers :[UserProxy],
bootstrap :[AppComponent],
imports :[...],
exports :[]
})
export class AppModule{}
platformBrowserDynamic()
.bootstrapModule(AppModule);
Application Injector
AppModule
UsersModule BrowserModule HttpModule
Sub InjectorSub Injector
providers : [ ServiceA, ServiceB, … ]
providers
token
"recipe" for
creating
@Injectable()
function logger(msg){ console.log(msg);}
bootstrap(App,[
provide(logger,{useValue: logger}),
provide(Service,{
useFactory : (logger)=>{
return {
load(){ logger('load'); }
}
},
deps:[logger]
})
]);
providers:[
ServiceA,
{ provide: 'app.config', useValue: {name:'ev'} }
]
constructor(
service:ServiceA,
@Inject('app.config') config
)
Class
token
String token
useClass? : Type,
useValue? : any,
useExisting?: any,
useFactory? : Function,
deps? : Object[],
multi? : boolean
Platform Injectors
Component Injectors
AppElement
Element
Application Injectors
Component
Metadata
 queries? : {[key: string]: any}
Directive
Metadata
<component my-directive>
<sub-comp/>
<sub-comp/>
</component>
<component my-directive>
<sub-comp/>
<sub-comp/>
</component>
Component Directive
TemplateContent
viewProviders
directives
pipes
Providers
@ViewChild
@ViewChildren
DOM Element
<component>
<sub-comp/>
<sub-comp/>
<sub-comp/>
</component>
providers
@host
@Component({
selector :'component', template:`...`,
providers :[], viewProviders:[]
})class Component{}
viewProviders | Directives
<div my-direc>
Hello World…
<ng-content/>
</div>
viewProvidersProviders
Template
@Component({...})
export class MyComponent {
constructor(
element : ElementRef
,viewContainer : ViewContainerRef
,changeDetector: ChangeDetectorRef
,template : TemplateRef
, render : Renderer
){...}
}
import {Component} from "@angular/core";
import {Type1,Type2,Type3} from "eyalVardi";
import {Pipe1,Directive1} from "eyalVardi";
import {Component2} from "eyalVardi";
import {Service1} from "eyalVardi";
@Component({
providers :[Type1,Type2],
viewProviders:[Type3]
})
export class MyComponent {
constructor(
element : ElementRef
){}
} Must solve in
runtime by
the Injector
<div dependency="1">
<div dependency="2">
<div dependency="3" my-directive>
<div dependency="4">
<div dependency="5"></div>
</div>
<div dependency="6"></div>
</div>
</div>
</div>
Dependency MyDirective Constructor
3 constructor(dependency: Dependency)
2 constructor(@Host() dependency: Dependency)
4 , 6 constructor(@Query(Dependency) dependencies:QueryList<Dependency>)
4 , 5 , 6 constructor(@Query(Dependency, {descendants: true})
dependencies:QueryList<Dependency>)
var t = new OpaqueToken("value");
var injector = Injector.resolveAndCreate([
provide(t, {useValue: "providedValue"})
]);
providers:[
provide{ APP_INITIALIZER ,useValue: appInit , multi: true},
provide{ PLATFORM_INITIALIZER,useValue: platformInit, multi: true}
]
@NgModule({
providers: [
ROUTER_PROVIDERS,
PathLocationStrategy,
{ provide: APP_BASE_HREF, useValue: '/my/app' }
]
})
Developer guides - forms
The Ultimate Guide to Forms in Angular 2
Angular code source
Angular 2.0 Dependency injection

Angular 2.0 Dependency injection