refactor(core): don’t store view factory in TemplateRef
Instead, generate `createEmbeddedView`.
This commit is contained in:
@ -73,7 +73,7 @@ export class CompileElement extends CompileNode {
|
||||
this.instances.set(resolveIdentifierToken(Identifiers.Injector).reference, this.injector);
|
||||
this.instances.set(
|
||||
resolveIdentifierToken(Identifiers.Renderer).reference, o.THIS_EXPR.prop('renderer'));
|
||||
if (this.hasViewContainer || this.hasEmbeddedView) {
|
||||
if (this.hasViewContainer) {
|
||||
this._createAppElement();
|
||||
}
|
||||
if (this.component) {
|
||||
@ -97,9 +97,7 @@ export class CompileElement extends CompileNode {
|
||||
this.view.createMethod.addStmt(statement);
|
||||
this.appElement = o.THIS_EXPR.prop(fieldName);
|
||||
this.instances.set(resolveIdentifierToken(Identifiers.AppElement).reference, this.appElement);
|
||||
if (this.hasViewContainer) {
|
||||
this.view.viewContainerAppElements.push(this.appElement);
|
||||
}
|
||||
this.view.appElements.push(this.appElement);
|
||||
}
|
||||
|
||||
private _createComponentFactoryResolver() {
|
||||
@ -144,7 +142,7 @@ export class CompileElement extends CompileNode {
|
||||
if (isPresent(embeddedView)) {
|
||||
var createTemplateRefExpr =
|
||||
o.importExpr(resolveIdentifier(Identifiers.TemplateRef_)).instantiate([
|
||||
this.appElement, this.embeddedView.viewFactory
|
||||
o.THIS_EXPR, o.literal(this.nodeIndex), this.renderNode
|
||||
]);
|
||||
var provider = new CompileProviderMetadata({
|
||||
token: resolveIdentifierToken(Identifiers.TemplateRef),
|
||||
|
@ -46,7 +46,7 @@ export class CompileView implements NameResolver {
|
||||
public rootNodes: CompileViewRootNode[] = [];
|
||||
public lastRenderNode: o.Expression = o.NULL_EXPR;
|
||||
|
||||
public viewContainerAppElements: o.Expression[] = [];
|
||||
public appElements: o.Expression[] = [];
|
||||
|
||||
public createMethod: CompileMethod;
|
||||
public animationBindingsMethod: CompileMethod;
|
||||
|
@ -477,7 +477,8 @@ function createViewClass(
|
||||
new o.ClassMethod('dirtyParentQueriesInternal', [], view.dirtyParentQueriesMethod.finish()),
|
||||
new o.ClassMethod('destroyInternal', [], generateDestroyMethod(view)),
|
||||
new o.ClassMethod('detachInternal', [], view.detachMethod.finish()),
|
||||
generateVisitRootNodesMethod(view), generateVisitProjectableNodesMethod(view)
|
||||
generateVisitRootNodesMethod(view), generateVisitProjectableNodesMethod(view),
|
||||
generateCreateEmbeddedViewsMethod(view)
|
||||
].filter((method) => method.body.length > 0);
|
||||
var superClass = view.genConfig.genDebugInfo ? Identifiers.DebugAppView : Identifiers.AppView;
|
||||
|
||||
@ -493,7 +494,7 @@ function createViewClass(
|
||||
|
||||
function generateDestroyMethod(view: CompileView): o.Statement[] {
|
||||
const stmts: o.Statement[] = [];
|
||||
view.viewContainerAppElements.forEach(
|
||||
view.appElements.forEach(
|
||||
(appElement) => { stmts.push(appElement.callMethod('destroyNestedViews', []).toStmt()); });
|
||||
view.viewChildren.forEach(
|
||||
(viewChild) => { stmts.push(viewChild.callMethod('destroy', []).toStmt()); });
|
||||
@ -599,7 +600,7 @@ function generateDetectChangesMethod(view: CompileView): o.Statement[] {
|
||||
}
|
||||
stmts.push(...view.animationBindingsMethod.finish());
|
||||
stmts.push(...view.detectChangesInInputsMethod.finish());
|
||||
view.viewContainerAppElements.forEach((appElement) => {
|
||||
view.appElements.forEach((appElement) => {
|
||||
stmts.push(
|
||||
appElement.callMethod('detectChangesInNestedViews', [DetectChangesVars.throwOnChange])
|
||||
.toStmt());
|
||||
@ -717,3 +718,26 @@ function generateVisitNodesStmts(
|
||||
});
|
||||
return stmts;
|
||||
}
|
||||
|
||||
function generateCreateEmbeddedViewsMethod(view: CompileView) {
|
||||
const nodeIndexVar = o.variable('nodeIndex');
|
||||
const stmts: o.Statement[] = [];
|
||||
view.nodes.forEach((node) => {
|
||||
if (node instanceof CompileElement) {
|
||||
if (node.embeddedView) {
|
||||
const parentNodeIndex = node.isRootElement() ? null : node.parent.nodeIndex;
|
||||
stmts.push(new o.IfStmt(
|
||||
nodeIndexVar.equals(o.literal(node.nodeIndex)),
|
||||
[new o.ReturnStatement(node.embeddedView.viewFactory.callFn([
|
||||
ViewProperties.viewUtils,
|
||||
o.THIS_EXPR.callMethod('injector', [o.literal(parentNodeIndex)]), o.THIS_EXPR,
|
||||
o.literal(node.nodeIndex), node.renderNode
|
||||
]))]));
|
||||
}
|
||||
}
|
||||
});
|
||||
stmts.push(new o.ReturnStatement(o.NULL_EXPR));
|
||||
return new o.ClassMethod(
|
||||
'createEmbeddedViewInternal', [new o.FnParam(nodeIndexVar.name, o.NUMBER_TYPE)], stmts,
|
||||
o.importType(resolveIdentifier(Identifiers.AppView), [o.DYNAMIC_TYPE]));
|
||||
}
|
||||
|
Reference in New Issue
Block a user