52 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright Google Inc. All Rights Reserved.
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| 
 | |
| import {RelativeInjectorLocation} from './interfaces/injector';
 | |
| import {TContainerNode, TElementNode, TNode} from './interfaces/node';
 | |
| import {DECLARATION_VIEW, LView, T_HOST} from './interfaces/view';
 | |
| import {getParentInjectorViewOffset} from './util/injector_utils';
 | |
| 
 | |
| /**
 | |
|  * If `startTNode.parent` exists and has an injector, returns TNode for that injector.
 | |
|  * Otherwise, unwraps a parent injector location number to find the view offset from the current
 | |
|  * injector, then walks up the declaration view tree until the TNode of the parent injector is
 | |
|  * found.
 | |
|  *
 | |
|  * @param location The location of the parent injector, which contains the view offset
 | |
|  * @param startView The LView instance from which to start walking up the view tree
 | |
|  * @param startTNode The TNode instance of the starting element
 | |
|  * @returns The TNode of the parent injector
 | |
|  */
 | |
| export function getParentInjectorTNode(
 | |
|     location: RelativeInjectorLocation, startView: LView, startTNode: TNode): TElementNode|
 | |
|     TContainerNode|null {
 | |
|   // If there is an injector on the parent TNode, retrieve the TNode for that injector.
 | |
|   if (startTNode.parent && startTNode.parent.injectorIndex !== -1) {
 | |
|     // view offset is 0
 | |
|     const injectorIndex = startTNode.parent.injectorIndex;
 | |
|     let tNode = startTNode.parent;
 | |
|     // If tNode.injectorIndex === tNode.parent.injectorIndex, then the index belongs to a parent
 | |
|     // injector.
 | |
|     while (tNode.parent != null && injectorIndex == tNode.parent.injectorIndex) {
 | |
|       tNode = tNode.parent;
 | |
|     }
 | |
|     return tNode;
 | |
|   }
 | |
|   let viewOffset = getParentInjectorViewOffset(location);
 | |
|   // view offset is 1
 | |
|   let parentView = startView;
 | |
|   let parentTNode = startView[T_HOST] as TElementNode;
 | |
|   // view offset is superior to 1
 | |
|   while (viewOffset > 1) {
 | |
|     parentView = parentView[DECLARATION_VIEW] !;
 | |
|     parentTNode = parentView[T_HOST] as TElementNode;
 | |
|     viewOffset--;
 | |
|   }
 | |
|   return parentTNode;
 | |
| }
 |