feat(ivy): implement the getters of ViewContainerRef (#25174)

BREAKING CHANGE: ViewContainerRef.parentInjector is deprecated without replacement

PR Close #25174
This commit is contained in:
Marc Laval
2018-07-25 18:11:39 +02:00
committed by Igor Minar
parent e99d860393
commit cd89eb8404
7 changed files with 134 additions and 14 deletions

View File

@ -41,6 +41,7 @@ export abstract class ViewContainerRef {
abstract get injector(): Injector;
/** @deprecated No replacement */
abstract get parentInjector(): Injector;
/**

View File

@ -552,9 +552,11 @@ export const QUERY_READ_FROM_NODE =
ngDevMode && assertNodeOfPossibleTypes(node, TNodeType.Container, TNodeType.Element);
if (directiveIdx > -1) {
return node.view[DIRECTIVES] ![directiveIdx];
} else if (node.tNode.type === TNodeType.Element) {
}
if (node.tNode.type === TNodeType.Element) {
return getOrCreateElementRef(injector);
} else if (node.tNode.type === TNodeType.Container) {
}
if (node.tNode.type === TNodeType.Container) {
return getOrCreateTemplateRef(injector);
}
throw new Error('fail');
@ -600,26 +602,55 @@ export function getOrCreateContainerRef(di: LInjector): viewEngine.ViewContainer
addToViewTree(vcRefHost.view, hostTNode.index as number, lContainer);
di.viewContainerRef = new ViewContainerRef(lContainerNode);
di.viewContainerRef = new ViewContainerRef(lContainerNode, vcRefHost);
}
return di.viewContainerRef;
}
class NodeInjector implements Injector {
constructor(private _lInjector: LInjector) {}
get(token: any): any {
if (token === viewEngine.TemplateRef) {
return getOrCreateTemplateRef(this._lInjector);
}
if (token === viewEngine.ViewContainerRef) {
return getOrCreateContainerRef(this._lInjector);
}
if (token === viewEngine.ElementRef) {
return getOrCreateElementRef(this._lInjector);
}
if (token === viewEngine_ChangeDetectorRef) {
return getOrCreateChangeDetectorRef(this._lInjector, null);
}
return getOrCreateInjectable(this._lInjector, token);
}
}
/**
* A ref to a container that enables adding and removing views from that container
* imperatively.
*/
class ViewContainerRef implements viewEngine.ViewContainerRef {
private _viewRefs: viewEngine.ViewRef[] = [];
// TODO(issue/24571): remove '!'.
element !: viewEngine.ElementRef;
// TODO(issue/24571): remove '!'.
injector !: Injector;
// TODO(issue/24571): remove '!'.
parentInjector !: Injector;
constructor(private _lContainerNode: LContainerNode) {}
constructor(
private _lContainerNode: LContainerNode, private _hostNode: LElementNode|LContainerNode) {}
get element(): ElementRef { return new ElementRef(this._hostNode.native); }
get injector(): Injector {
return new NodeInjector(getOrCreateNodeInjectorForNode(this._hostNode));
}
/** @deprecated No replacement */
get parentInjector(): Injector {
const parentLInjector = getParentLNode(this._hostNode).nodeInjector;
return parentLInjector ? new NodeInjector(parentLInjector) : Injector.NULL;
}
clear(): void {
const lContainer = this._lContainerNode.data;
@ -651,7 +682,7 @@ class ViewContainerRef implements viewEngine.ViewContainerRef {
ngModuleRef?: viewEngine.NgModuleRef<any>|undefined): viewEngine.ComponentRef<C> {
const contextInjector = injector || this.parentInjector;
if (!ngModuleRef && contextInjector) {
ngModuleRef = contextInjector.get(viewEngine.NgModuleRef);
ngModuleRef = contextInjector.get(viewEngine.NgModuleRef, null);
}
const componentRef =

View File

@ -336,7 +336,7 @@ export function createLViewData<T>(
null, // directives
null, // cleanupInstances
context, // context
viewData && viewData[INJECTOR], // injector
viewData && viewData[INJECTOR] || null, // injector
renderer, // renderer
sanitizer || null, // sanitizer
null, // tail

View File

@ -138,6 +138,7 @@ class ViewContainerRef_ implements ViewContainerData {
get injector(): Injector { return new Injector_(this._view, this._elDef); }
/** @deprecated No replacement */
get parentInjector(): Injector {
let view = this._view;
let elDef = this._elDef.parent;