@@ -17,8 +17,8 @@ import {Renderer} from '../render/api';
1717import { Type } from '../type' ;
1818
1919import { queryDef } from './query' ;
20- import { BindingDef , BindingType , DepDef , DepFlags , DisposableFn , EntryAction , NodeData , NodeDef , NodeFlags , NodeType , ProviderData , ProviderOutputDef , ProviderType , QueryBindingType , QueryDef , QueryValueType , Services , ViewData , ViewDefinition , ViewFlags , ViewState , asElementData , asProviderData } from './types' ;
21- import { checkAndUpdateBinding , dispatchEvent , entryAction , findElementDef , setBindingDebugInfo , setCurrentNode , unwrapValue } from './util' ;
20+ import { BindingDef , BindingType , DepDef , DepFlags , DisposableFn , EntryAction , NodeData , NodeDef , NodeFlags , NodeType , ProviderData , ProviderOutputDef , ProviderType , QueryBindingType , QueryDef , QueryValueType , Refs , RootData , ViewData , ViewDefinition , ViewFlags , ViewState , asElementData , asProviderData } from './types' ;
21+ import { checkAndUpdateBinding , dispatchEvent , entryAction , findElementDef , parentDiIndex , setBindingDebugInfo , setCurrentNode , unwrapValue } from './util' ;
2222
2323const _tokenKeyCache = new Map < any , string > ( ) ;
2424
@@ -169,7 +169,7 @@ export function checkAndUpdateProviderInline(
169169 if ( changes ) {
170170 provider . ngOnChanges ( changes ) ;
171171 }
172- if ( view . state === ViewState . FirstCheck && ( def . flags & NodeFlags . OnInit ) ) {
172+ if ( ( view . state & ViewState . FirstCheck ) && ( def . flags & NodeFlags . OnInit ) ) {
173173 provider . ngOnInit ( ) ;
174174 }
175175 if ( def . flags & NodeFlags . DoCheck ) {
@@ -186,7 +186,7 @@ export function checkAndUpdateProviderDynamic(view: ViewData, def: NodeDef, valu
186186 if ( changes ) {
187187 provider . ngOnChanges ( changes ) ;
188188 }
189- if ( view . state === ViewState . FirstCheck && ( def . flags & NodeFlags . OnInit ) ) {
189+ if ( ( view . state & ViewState . FirstCheck ) && ( def . flags & NodeFlags . OnInit ) ) {
190190 provider . ngOnInit ( ) ;
191191 }
192192 if ( def . flags & NodeFlags . DoCheck ) {
@@ -290,16 +290,18 @@ function callFactory(
290290}
291291
292292export function resolveDep (
293- view : ViewData , requestNodeIndex : number , elIndex : number , depDef : DepDef ) : any {
294- const notFoundValue = depDef . flags & DepFlags . Optional ? null : Injector . THROW_IF_NOT_FOUND ;
293+ view : ViewData , requestNodeIndex : number , elIndex : number , depDef : DepDef ,
294+ notFoundValue = Injector . THROW_IF_NOT_FOUND ) : any {
295+ const startView = view ;
296+ if ( depDef . flags & DepFlags . Optional ) {
297+ notFoundValue = null ;
298+ }
295299 const tokenKey = depDef . tokenKey ;
296300
297301 if ( depDef . flags & DepFlags . SkipSelf ) {
298302 requestNodeIndex = null ;
299- const elDef = view . def . nodes [ elIndex ] ;
300- if ( elDef . parent != null ) {
301- elIndex = elDef . parent ;
302- } else {
303+ elIndex = view . def . nodes [ elIndex ] . parent ;
304+ while ( elIndex == null && view ) {
303305 elIndex = parentDiIndex ( view ) ;
304306 view = view . parent ;
305307 }
@@ -317,9 +319,9 @@ export function resolveDep(
317319 case ElementRefTokenKey :
318320 return new ElementRef ( asElementData ( view , elIndex ) . renderElement ) ;
319321 case ViewContainerRefTokenKey :
320- return view . services . createViewContainerRef ( asElementData ( view , elIndex ) ) ;
322+ return Refs . createViewContainerRef ( view , elIndex ) ;
321323 case TemplateRefTokenKey :
322- return view . services . createTemplateRef ( view , elDef ) ;
324+ return Refs . createTemplateRef ( view , elDef ) ;
323325 case ChangeDetectorRefTokenKey :
324326 let cdView = view ;
325327 // If we are still checking dependencies on the initial element...
@@ -330,9 +332,9 @@ export function resolveDep(
330332 }
331333 }
332334 // A ViewRef is also a ChangeDetectorRef
333- return view . services . createViewRef ( cdView ) ;
335+ return Refs . createViewRef ( cdView ) ;
334336 case InjectorRefTokenKey :
335- return createInjector ( view , elIndex ) ;
337+ return Refs . createInjector ( view , elIndex ) ;
336338 default :
337339 const providerIndex = elDef . element . providerIndices [ tokenKey ] ;
338340 if ( providerIndex != null ) {
@@ -347,34 +349,7 @@ export function resolveDep(
347349 elIndex = parentDiIndex ( view ) ;
348350 view = view . parent ;
349351 }
350- return Injector . NULL . get ( depDef . token , notFoundValue ) ;
351- }
352-
353- /**
354- * for component views, this is the same as parentIndex.
355- * for embedded views, this is the index of the parent node
356- * that contains the view container.
357- */
358- function parentDiIndex ( view : ViewData ) : number {
359- if ( view . parent ) {
360- const parentNodeDef = view . def . nodes [ view . parentIndex ] ;
361- return parentNodeDef . element && parentNodeDef . element . template ? parentNodeDef . parent :
362- parentNodeDef . index ;
363- }
364- return view . parentIndex ;
365- }
366-
367- export function createInjector ( view : ViewData , elIndex : number ) : Injector {
368- return new Injector_ ( view , elIndex ) ;
369- }
370-
371- class Injector_ implements Injector {
372- constructor ( private view : ViewData , private elIndex : number ) { }
373- get ( token : any , notFoundValue ?: any ) : any {
374- return resolveDep (
375- this . view , undefined , this . elIndex ,
376- { flags : DepFlags . None , token, tokenKey : tokenKey ( token ) } ) ;
377- }
352+ return startView . root . injector . get ( depDef . token , notFoundValue ) ;
378353}
379354
380355function checkAndUpdateProp (
@@ -385,8 +360,9 @@ function checkAndUpdateProp(
385360 if ( def . flags & NodeFlags . OnChanges ) {
386361 const oldValue = view . oldValues [ def . bindingIndex + bindingIdx ] ;
387362 changed = checkAndUpdateBinding ( view , def , bindingIdx , value ) ;
388- change =
389- changed ? new SimpleChange ( oldValue , value , view . state === ViewState . FirstCheck ) : null ;
363+ change = changed ?
364+ new SimpleChange ( oldValue , value , ( view . state & ViewState . FirstCheck ) !== 0 ) :
365+ null ;
390366 } else {
391367 changed = checkAndUpdateBinding ( view , def , bindingIdx , value ) ;
392368 }
0 commit comments