refactor(core): view engine, refactor runtime data
Structure in a better way, in preparation for queries.
This commit is contained in:
parent
05b2b49711
commit
fc8694ed11
@ -97,7 +97,7 @@ export function elementDef(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function createElement(view: ViewData, renderHost: any, def: NodeDef): NodeData {
|
export function createElement(view: ViewData, renderHost: any, def: NodeDef): NodeData {
|
||||||
const parentNode = def.parent != null ? view.nodes[def.parent].renderNode : renderHost;
|
const parentNode = def.parent != null ? view.nodes[def.parent].elementOrText.node : renderHost;
|
||||||
const elDef = def.element;
|
const elDef = def.element;
|
||||||
let el: any;
|
let el: any;
|
||||||
if (view.renderer) {
|
if (view.renderer) {
|
||||||
@ -150,10 +150,10 @@ export function createElement(view: ViewData, renderHost: any, def: NodeDef): No
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
renderNode: el,
|
elementOrText:
|
||||||
|
{node: el, embeddedViews: (def.flags & NodeFlags.HasEmbeddedViews) ? [] : undefined},
|
||||||
provider: undefined,
|
provider: undefined,
|
||||||
embeddedViews: (def.flags & NodeFlags.HasEmbeddedViews) ? [] : undefined,
|
pureExpression: undefined,
|
||||||
componentView: undefined
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +213,7 @@ function checkAndUpdateElementValue(view: ViewData, def: NodeDef, bindingIdx: nu
|
|||||||
|
|
||||||
const binding = def.bindings[bindingIdx];
|
const binding = def.bindings[bindingIdx];
|
||||||
const name = binding.name;
|
const name = binding.name;
|
||||||
const renderNode = view.nodes[def.index].renderNode;
|
const renderNode = view.nodes[def.index].elementOrText.node;
|
||||||
switch (binding.type) {
|
switch (binding.type) {
|
||||||
case BindingType.ElementAttribute:
|
case BindingType.ElementAttribute:
|
||||||
setElementAttribute(view, binding, renderNode, name, value);
|
setElementAttribute(view, binding, renderNode, name, value);
|
||||||
|
@ -102,16 +102,16 @@ export function createProvider(view: ViewData, def: NodeDef, componentView: View
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
renderNode: undefined,
|
elementOrText: undefined,
|
||||||
provider,
|
provider: {instance: provider, componentView: componentView},
|
||||||
embeddedViews: undefined, componentView,
|
pureExpression: undefined,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function checkAndUpdateProviderInline(
|
export function checkAndUpdateProviderInline(
|
||||||
view: ViewData, def: NodeDef, v0: any, v1: any, v2: any, v3: any, v4: any, v5: any, v6: any,
|
view: ViewData, def: NodeDef, v0: any, v1: any, v2: any, v3: any, v4: any, v5: any, v6: any,
|
||||||
v7: any, v8: any, v9: any) {
|
v7: any, v8: any, v9: any) {
|
||||||
const provider = view.nodes[def.index].provider;
|
const provider = view.nodes[def.index].provider.instance;
|
||||||
let changes: SimpleChanges;
|
let changes: SimpleChanges;
|
||||||
// Note: fallthrough is intended!
|
// Note: fallthrough is intended!
|
||||||
switch (def.bindings.length) {
|
switch (def.bindings.length) {
|
||||||
@ -148,7 +148,7 @@ export function checkAndUpdateProviderInline(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function checkAndUpdateProviderDynamic(view: ViewData, def: NodeDef, values: any[]) {
|
export function checkAndUpdateProviderDynamic(view: ViewData, def: NodeDef, values: any[]) {
|
||||||
const provider = view.nodes[def.index].provider;
|
const provider = view.nodes[def.index].provider.instance;
|
||||||
let changes: SimpleChanges;
|
let changes: SimpleChanges;
|
||||||
for (let i = 0; i < values.length; i++) {
|
for (let i = 0; i < values.length; i++) {
|
||||||
changes = checkAndUpdateProp(view, provider, def, i, values[i], changes);
|
changes = checkAndUpdateProp(view, provider, def, i, values[i], changes);
|
||||||
@ -217,7 +217,7 @@ export function resolveDep(
|
|||||||
return Injector.NULL.get(depDef.token, notFoundValue);
|
return Injector.NULL.get(depDef.token, notFoundValue);
|
||||||
}
|
}
|
||||||
case ElementRefTokenKey:
|
case ElementRefTokenKey:
|
||||||
return new ElementRef(view.nodes[elIndex].renderNode);
|
return new ElementRef(view.nodes[elIndex].elementOrText.node);
|
||||||
case ViewContainerRefTokenKey:
|
case ViewContainerRefTokenKey:
|
||||||
return view.services.createViewContainerRef(view.nodes[elIndex]);
|
return view.services.createViewContainerRef(view.nodes[elIndex]);
|
||||||
case TemplateRefTokenKey:
|
case TemplateRefTokenKey:
|
||||||
@ -225,7 +225,7 @@ export function resolveDep(
|
|||||||
default:
|
default:
|
||||||
const providerIndex = elDef.providerIndices[tokenKey];
|
const providerIndex = elDef.providerIndices[tokenKey];
|
||||||
if (providerIndex != null) {
|
if (providerIndex != null) {
|
||||||
return view.nodes[providerIndex].provider;
|
return view.nodes[providerIndex].provider.instance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elIndex = view.parentIndex;
|
elIndex = view.parentIndex;
|
||||||
@ -255,7 +255,7 @@ function checkAndUpdateProp(
|
|||||||
|
|
||||||
if (view.def.flags & ViewFlags.LogBindingUpdate) {
|
if (view.def.flags & ViewFlags.LogBindingUpdate) {
|
||||||
setBindingDebugInfo(
|
setBindingDebugInfo(
|
||||||
view.renderer, view.nodes[def.parent].renderNode, binding.nonMinifiedName, value);
|
view.renderer, view.nodes[def.parent].elementOrText.node, binding.nonMinifiedName, value);
|
||||||
}
|
}
|
||||||
if (change) {
|
if (change) {
|
||||||
changes = changes || {};
|
changes = changes || {};
|
||||||
@ -276,7 +276,7 @@ export function callLifecycleHooksChildrenFirst(view: ViewData, lifecycles: Node
|
|||||||
const nodeIndex = nodeDef.index;
|
const nodeIndex = nodeDef.index;
|
||||||
if (nodeDef.flags & lifecycles) {
|
if (nodeDef.flags & lifecycles) {
|
||||||
// a leaf
|
// a leaf
|
||||||
callProviderLifecycles(view.nodes[nodeIndex].provider, nodeDef.flags & lifecycles);
|
callProviderLifecycles(view.nodes[nodeIndex].provider.instance, nodeDef.flags & lifecycles);
|
||||||
} else if ((nodeDef.childFlags & lifecycles) === 0) {
|
} else if ((nodeDef.childFlags & lifecycles) === 0) {
|
||||||
// a parent with leafs
|
// a parent with leafs
|
||||||
// no child matches one of the lifecycles,
|
// no child matches one of the lifecycles,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import {resolveDep, tokenKey} from './provider';
|
import {resolveDep, tokenKey} from './provider';
|
||||||
import {BindingDef, BindingType, DepDef, DepFlags, NodeData, NodeDef, NodeType, PureExpressionData, PureExpressionType, ViewData} from './types';
|
import {BindingDef, BindingType, DepDef, DepFlags, NodeData, NodeDef, NodeType, ProviderData, PureExpressionType, ViewData} from './types';
|
||||||
import {checkAndUpdateBinding} from './util';
|
import {checkAndUpdateBinding} from './util';
|
||||||
|
|
||||||
export function purePipeDef(pipeToken: any, argCount: number): NodeDef {
|
export function purePipeDef(pipeToken: any, argCount: number): NodeDef {
|
||||||
@ -62,13 +62,7 @@ export function createPureExpression(view: ViewData, def: NodeDef): NodeData {
|
|||||||
const pipe = def.pureExpression.pipeDep ?
|
const pipe = def.pureExpression.pipeDep ?
|
||||||
resolveDep(view, def.parent, def.pureExpression.pipeDep) :
|
resolveDep(view, def.parent, def.pureExpression.pipeDep) :
|
||||||
undefined;
|
undefined;
|
||||||
const data: PureExpressionData = {value: undefined, pipe: pipe};
|
return {elementOrText: undefined, provider: undefined, pureExpression: {value: undefined, pipe}};
|
||||||
return {
|
|
||||||
renderNode: undefined,
|
|
||||||
provider: data,
|
|
||||||
embeddedViews: undefined,
|
|
||||||
componentView: undefined
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function checkAndUpdatePureExpressionInline(
|
export function checkAndUpdatePureExpressionInline(
|
||||||
@ -101,7 +95,7 @@ export function checkAndUpdatePureExpressionInline(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
const data: PureExpressionData = view.nodes[def.index].provider;
|
const data = view.nodes[def.index].pureExpression;
|
||||||
let value: any;
|
let value: any;
|
||||||
switch (def.pureExpression.type) {
|
switch (def.pureExpression.type) {
|
||||||
case PureExpressionType.Array:
|
case PureExpressionType.Array:
|
||||||
@ -206,7 +200,7 @@ export function checkAndUpdatePureExpressionDynamic(view: ViewData, def: NodeDef
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (changed) {
|
if (changed) {
|
||||||
const data: PureExpressionData = view.nodes[def.index].provider;
|
const data = view.nodes[def.index].pureExpression;
|
||||||
let value: any;
|
let value: any;
|
||||||
switch (def.pureExpression.type) {
|
switch (def.pureExpression.type) {
|
||||||
case PureExpressionType.Array:
|
case PureExpressionType.Array:
|
||||||
|
@ -48,16 +48,18 @@ class ViewContainerRef_ implements ViewContainerRef {
|
|||||||
get parentInjector(): Injector { return <Injector>unimplemented(); }
|
get parentInjector(): Injector { return <Injector>unimplemented(); }
|
||||||
|
|
||||||
clear(): void {
|
clear(): void {
|
||||||
const len = this._data.embeddedViews.length;
|
const len = this._data.elementOrText.embeddedViews.length;
|
||||||
for (let i = len - 1; i >= 0; i--) {
|
for (let i = len - 1; i >= 0; i--) {
|
||||||
const view = detachEmbeddedView(this._data, i);
|
const view = detachEmbeddedView(this._data, i);
|
||||||
destroyView(view);
|
destroyView(view);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get(index: number): ViewRef { return new ViewRef_(this._data.embeddedViews[index]); }
|
get(index: number): ViewRef {
|
||||||
|
return new ViewRef_(this._data.elementOrText.embeddedViews[index]);
|
||||||
|
}
|
||||||
|
|
||||||
get length(): number { return this._data.embeddedViews.length; };
|
get length(): number { return this._data.elementOrText.embeddedViews.length; };
|
||||||
|
|
||||||
createEmbeddedView<C>(templateRef: TemplateRef<C>, context?: C, index?: number):
|
createEmbeddedView<C>(templateRef: TemplateRef<C>, context?: C, index?: number):
|
||||||
EmbeddedViewRef<C> {
|
EmbeddedViewRef<C> {
|
||||||
@ -81,7 +83,7 @@ class ViewContainerRef_ implements ViewContainerRef {
|
|||||||
move(viewRef: ViewRef, currentIndex: number): ViewRef { return unimplemented(); }
|
move(viewRef: ViewRef, currentIndex: number): ViewRef { return unimplemented(); }
|
||||||
|
|
||||||
indexOf(viewRef: ViewRef): number {
|
indexOf(viewRef: ViewRef): number {
|
||||||
return this._data.embeddedViews.indexOf((<ViewRef_>viewRef)._view);
|
return this._data.elementOrText.embeddedViews.indexOf((<ViewRef_>viewRef)._view);
|
||||||
}
|
}
|
||||||
|
|
||||||
remove(index?: number): void {
|
remove(index?: number): void {
|
||||||
@ -126,6 +128,6 @@ class TemplateRef_ implements TemplateRef<any> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get elementRef(): ElementRef {
|
get elementRef(): ElementRef {
|
||||||
return new ElementRef(this._parentView.nodes[this._def.index].renderNode);
|
return new ElementRef(this._parentView.nodes[this._def.index].elementOrText.node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ export function textDef(constants: string[]): NodeDef {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function createText(view: ViewData, renderHost: any, def: NodeDef): NodeData {
|
export function createText(view: ViewData, renderHost: any, def: NodeDef): NodeData {
|
||||||
const parentNode = def.parent != null ? view.nodes[def.parent].renderNode : renderHost;
|
const parentNode = def.parent != null ? view.nodes[def.parent].elementOrText.node : renderHost;
|
||||||
let renderNode: any;
|
let renderNode: any;
|
||||||
if (view.renderer) {
|
if (view.renderer) {
|
||||||
renderNode = view.renderer.createText(parentNode, def.text.prefix);
|
renderNode = view.renderer.createText(parentNode, def.text.prefix);
|
||||||
@ -54,7 +54,11 @@ export function createText(view: ViewData, renderHost: any, def: NodeDef): NodeD
|
|||||||
parentNode.appendChild(renderNode);
|
parentNode.appendChild(renderNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {renderNode, provider: undefined, embeddedViews: undefined, componentView: undefined};
|
return {
|
||||||
|
elementOrText: {node: renderNode, embeddedViews: undefined},
|
||||||
|
provider: undefined,
|
||||||
|
pureExpression: undefined
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function checkAndUpdateTextInline(
|
export function checkAndUpdateTextInline(
|
||||||
@ -112,7 +116,7 @@ export function checkAndUpdateTextInline(
|
|||||||
value = _addInterpolationPart(v0, bindings[0]) + value;
|
value = _addInterpolationPart(v0, bindings[0]) + value;
|
||||||
}
|
}
|
||||||
value = def.text.prefix + value;
|
value = def.text.prefix + value;
|
||||||
const renderNode = view.nodes[def.index].renderNode;
|
const renderNode = view.nodes[def.index].elementOrText.node;
|
||||||
if (view.renderer) {
|
if (view.renderer) {
|
||||||
view.renderer.setText(renderNode, value);
|
view.renderer.setText(renderNode, value);
|
||||||
} else {
|
} else {
|
||||||
@ -137,7 +141,7 @@ export function checkAndUpdateTextDynamic(view: ViewData, def: NodeDef, values:
|
|||||||
value = value + _addInterpolationPart(values[i], bindings[i]);
|
value = value + _addInterpolationPart(values[i], bindings[i]);
|
||||||
}
|
}
|
||||||
value = def.text.prefix + value;
|
value = def.text.prefix + value;
|
||||||
const renderNode = view.nodes[def.index].renderNode;
|
const renderNode = view.nodes[def.index].elementOrText.node;
|
||||||
if (view.renderer) {
|
if (view.renderer) {
|
||||||
view.renderer.setText(renderNode, value);
|
view.renderer.setText(renderNode, value);
|
||||||
} else {
|
} else {
|
||||||
|
@ -206,12 +206,21 @@ export type DisposableFn = () => void;
|
|||||||
* Attention: Adding fields to this is performance sensitive!
|
* Attention: Adding fields to this is performance sensitive!
|
||||||
*/
|
*/
|
||||||
export interface NodeData {
|
export interface NodeData {
|
||||||
renderNode: any;
|
elementOrText: ElementOrTextData;
|
||||||
provider: PureExpressionData|any;
|
provider: ProviderData;
|
||||||
componentView: ViewData;
|
pureExpression: PureExpressionData;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ElementOrTextData {
|
||||||
|
node: any;
|
||||||
embeddedViews: ViewData[];
|
embeddedViews: ViewData[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ProviderData {
|
||||||
|
instance: any;
|
||||||
|
componentView: ViewData;
|
||||||
|
}
|
||||||
|
|
||||||
export interface PureExpressionData {
|
export interface PureExpressionData {
|
||||||
value: any;
|
value: any;
|
||||||
pipe: PipeTransform;
|
pipe: PipeTransform;
|
||||||
|
@ -13,7 +13,7 @@ import {checkAndUpdateElementDynamic, checkAndUpdateElementInline, createElement
|
|||||||
import {callLifecycleHooksChildrenFirst, checkAndUpdateProviderDynamic, checkAndUpdateProviderInline, createProvider} from './provider';
|
import {callLifecycleHooksChildrenFirst, checkAndUpdateProviderDynamic, checkAndUpdateProviderInline, createProvider} from './provider';
|
||||||
import {checkAndUpdatePureExpressionDynamic, checkAndUpdatePureExpressionInline, createPureExpression} from './pure_expression';
|
import {checkAndUpdatePureExpressionDynamic, checkAndUpdatePureExpressionInline, createPureExpression} from './pure_expression';
|
||||||
import {checkAndUpdateTextDynamic, checkAndUpdateTextInline, createText} from './text';
|
import {checkAndUpdateTextDynamic, checkAndUpdateTextInline, createText} from './text';
|
||||||
import {ElementDef, NodeData, NodeDef, NodeFlags, NodeType, NodeUpdater, ProviderDef, PureExpressionData, Services, TextDef, ViewData, ViewDefinition, ViewFlags, ViewHandleEventFn, ViewUpdateFn} from './types';
|
import {ElementDef, NodeData, NodeDef, NodeFlags, NodeType, NodeUpdater, ProviderData, ProviderDef, Services, TextDef, ViewData, ViewDefinition, ViewFlags, ViewHandleEventFn, ViewUpdateFn} from './types';
|
||||||
import {checkBindingNoChanges} from './util';
|
import {checkBindingNoChanges} from './util';
|
||||||
|
|
||||||
const NOOP = (): any => undefined;
|
const NOOP = (): any => undefined;
|
||||||
@ -274,8 +274,7 @@ const CheckNoChanges: NodeUpdater = {
|
|||||||
checkBindingNoChanges(view, nodeDef, 0, v0);
|
checkBindingNoChanges(view, nodeDef, 0, v0);
|
||||||
}
|
}
|
||||||
if (nodeDef.type === NodeType.PureExpression) {
|
if (nodeDef.type === NodeType.PureExpression) {
|
||||||
const data: PureExpressionData = view.nodes[index].provider;
|
return view.nodes[index].pureExpression.value;
|
||||||
return data.value;
|
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
},
|
},
|
||||||
@ -285,8 +284,7 @@ const CheckNoChanges: NodeUpdater = {
|
|||||||
checkBindingNoChanges(view, nodeDef, i, values[i]);
|
checkBindingNoChanges(view, nodeDef, i, values[i]);
|
||||||
}
|
}
|
||||||
if (nodeDef.type === NodeType.PureExpression) {
|
if (nodeDef.type === NodeType.PureExpression) {
|
||||||
const data: PureExpressionData = view.nodes[index].provider;
|
return view.nodes[index].pureExpression.value;
|
||||||
return data.value;
|
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
@ -321,8 +319,7 @@ const CheckAndUpdate: NodeUpdater = {
|
|||||||
return undefined;
|
return undefined;
|
||||||
case NodeType.PureExpression:
|
case NodeType.PureExpression:
|
||||||
checkAndUpdatePureExpressionInline(view, nodeDef, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
|
checkAndUpdatePureExpressionInline(view, nodeDef, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
|
||||||
const data: PureExpressionData = view.nodes[index].provider;
|
return view.nodes[index].pureExpression.value;
|
||||||
return data.value;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
checkDynamic: (view: ViewData, index: number, values: any[]): void => {
|
checkDynamic: (view: ViewData, index: number, values: any[]): void => {
|
||||||
@ -339,8 +336,7 @@ const CheckAndUpdate: NodeUpdater = {
|
|||||||
return undefined;
|
return undefined;
|
||||||
case NodeType.PureExpression:
|
case NodeType.PureExpression:
|
||||||
checkAndUpdatePureExpressionDynamic(view, nodeDef, values);
|
checkAndUpdatePureExpressionDynamic(view, nodeDef, values);
|
||||||
const data: PureExpressionData = view.nodes[index].provider;
|
return view.nodes[index].pureExpression.value;
|
||||||
return data.value;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -374,13 +370,15 @@ function execComponentViewsAction(view: ViewData, action: ViewAction) {
|
|||||||
// a leaf
|
// a leaf
|
||||||
const nodeData = view.nodes[i];
|
const nodeData = view.nodes[i];
|
||||||
if (action === ViewAction.InitComponent) {
|
if (action === ViewAction.InitComponent) {
|
||||||
let renderHost = view.nodes[nodeDef.parent].renderNode;
|
let renderHost = view.nodes[nodeDef.parent].elementOrText.node;
|
||||||
if (view.renderer) {
|
if (view.renderer) {
|
||||||
renderHost = view.renderer.createViewRoot(renderHost);
|
renderHost = view.renderer.createViewRoot(renderHost);
|
||||||
}
|
}
|
||||||
initView(nodeData.componentView, renderHost, nodeData.provider, nodeData.provider);
|
initView(
|
||||||
|
nodeData.provider.componentView, renderHost, nodeData.provider.instance,
|
||||||
|
nodeData.provider.instance);
|
||||||
} else {
|
} else {
|
||||||
callViewAction(nodeData.componentView, action);
|
callViewAction(nodeData.provider.componentView, action);
|
||||||
}
|
}
|
||||||
} else if ((nodeDef.childFlags & NodeFlags.HasComponent) === 0) {
|
} else if ((nodeDef.childFlags & NodeFlags.HasComponent) === 0) {
|
||||||
// a parent with leafs
|
// a parent with leafs
|
||||||
@ -401,7 +399,7 @@ function execEmbeddedViewsAction(view: ViewData, action: ViewAction) {
|
|||||||
if (nodeDef.flags & NodeFlags.HasEmbeddedViews) {
|
if (nodeDef.flags & NodeFlags.HasEmbeddedViews) {
|
||||||
// a leaf
|
// a leaf
|
||||||
const nodeData = view.nodes[i];
|
const nodeData = view.nodes[i];
|
||||||
const embeddedViews = nodeData.embeddedViews;
|
const embeddedViews = nodeData.elementOrText.embeddedViews;
|
||||||
if (embeddedViews) {
|
if (embeddedViews) {
|
||||||
for (let k = 0; k < embeddedViews.length; k++) {
|
for (let k = 0; k < embeddedViews.length; k++) {
|
||||||
callViewAction(embeddedViews[k], action);
|
callViewAction(embeddedViews[k], action);
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
import {NodeData, NodeFlags, ViewData} from './types';
|
import {NodeData, NodeFlags, ViewData} from './types';
|
||||||
|
|
||||||
export function attachEmbeddedView(node: NodeData, viewIndex: number, view: ViewData) {
|
export function attachEmbeddedView(node: NodeData, viewIndex: number, view: ViewData) {
|
||||||
let embeddedViews = node.embeddedViews;
|
let embeddedViews = node.elementOrText.embeddedViews;
|
||||||
if (viewIndex == null) {
|
if (viewIndex == null) {
|
||||||
viewIndex = embeddedViews.length;
|
viewIndex = embeddedViews.length;
|
||||||
}
|
}
|
||||||
@ -21,7 +21,7 @@ export function attachEmbeddedView(node: NodeData, viewIndex: number, view: View
|
|||||||
}
|
}
|
||||||
const prevView = viewIndex > 0 ? embeddedViews[viewIndex - 1] : null;
|
const prevView = viewIndex > 0 ? embeddedViews[viewIndex - 1] : null;
|
||||||
const prevNode = prevView ? prevView.nodes[prevView.def.lastRootNode] : node;
|
const prevNode = prevView ? prevView.nodes[prevView.def.lastRootNode] : node;
|
||||||
const prevRenderNode = prevNode.renderNode;
|
const prevRenderNode = prevNode.elementOrText.node;
|
||||||
if (view.renderer) {
|
if (view.renderer) {
|
||||||
view.renderer.attachViewAfter(prevRenderNode, rootRenderNodes(view));
|
view.renderer.attachViewAfter(prevRenderNode, rootRenderNodes(view));
|
||||||
} else {
|
} else {
|
||||||
@ -35,7 +35,8 @@ export function attachEmbeddedView(node: NodeData, viewIndex: number, view: View
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function detachEmbeddedView(node: NodeData, viewIndex: number): ViewData {
|
export function detachEmbeddedView(node: NodeData, viewIndex: number): ViewData {
|
||||||
const embeddedViews = node.embeddedViews;
|
const renderData = node.elementOrText;
|
||||||
|
const embeddedViews = renderData.embeddedViews;
|
||||||
if (viewIndex == null) {
|
if (viewIndex == null) {
|
||||||
viewIndex = embeddedViews.length;
|
viewIndex = embeddedViews.length;
|
||||||
}
|
}
|
||||||
@ -49,7 +50,7 @@ export function detachEmbeddedView(node: NodeData, viewIndex: number): ViewData
|
|||||||
if (view.renderer) {
|
if (view.renderer) {
|
||||||
view.renderer.detachView(rootRenderNodes(view));
|
view.renderer.detachView(rootRenderNodes(view));
|
||||||
} else {
|
} else {
|
||||||
const parentNode = node.renderNode.parentNode;
|
const parentNode = renderData.node.parentNode;
|
||||||
if (parentNode) {
|
if (parentNode) {
|
||||||
directDomAttachDetachSiblingRenderNodes(
|
directDomAttachDetachSiblingRenderNodes(
|
||||||
view, 0, DirectDomAction.RemoveChild, parentNode, null);
|
view, 0, DirectDomAction.RemoveChild, parentNode, null);
|
||||||
@ -67,8 +68,8 @@ export function rootRenderNodes(view: ViewData): any[] {
|
|||||||
function collectSiblingRenderNodes(view: ViewData, startIndex: number, target: any[]) {
|
function collectSiblingRenderNodes(view: ViewData, startIndex: number, target: any[]) {
|
||||||
for (let i = startIndex; i < view.nodes.length; i++) {
|
for (let i = startIndex; i < view.nodes.length; i++) {
|
||||||
const nodeDef = view.def.nodes[i];
|
const nodeDef = view.def.nodes[i];
|
||||||
const nodeData = view.nodes[i];
|
const nodeData = view.nodes[i].elementOrText;
|
||||||
target.push(nodeData.renderNode);
|
target.push(nodeData.node);
|
||||||
if (nodeDef.flags & NodeFlags.HasEmbeddedViews) {
|
if (nodeDef.flags & NodeFlags.HasEmbeddedViews) {
|
||||||
const embeddedViews = nodeData.embeddedViews;
|
const embeddedViews = nodeData.embeddedViews;
|
||||||
if (embeddedViews) {
|
if (embeddedViews) {
|
||||||
@ -93,16 +94,16 @@ function directDomAttachDetachSiblingRenderNodes(
|
|||||||
nextSibling: any) {
|
nextSibling: any) {
|
||||||
for (let i = startIndex; i < view.nodes.length; i++) {
|
for (let i = startIndex; i < view.nodes.length; i++) {
|
||||||
const nodeDef = view.def.nodes[i];
|
const nodeDef = view.def.nodes[i];
|
||||||
const nodeData = view.nodes[i];
|
const nodeData = view.nodes[i].elementOrText;
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case DirectDomAction.AppendChild:
|
case DirectDomAction.AppendChild:
|
||||||
parentNode.appendChild(nodeData.renderNode);
|
parentNode.appendChild(nodeData.node);
|
||||||
break;
|
break;
|
||||||
case DirectDomAction.InsertBefore:
|
case DirectDomAction.InsertBefore:
|
||||||
parentNode.insertBefore(nodeData.renderNode, nextSibling);
|
parentNode.insertBefore(nodeData.node, nextSibling);
|
||||||
break;
|
break;
|
||||||
case DirectDomAction.RemoveChild:
|
case DirectDomAction.RemoveChild:
|
||||||
parentNode.removeChild(nodeData.renderNode);
|
parentNode.removeChild(nodeData.node);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (nodeDef.flags & NodeFlags.HasEmbeddedViews) {
|
if (nodeDef.flags & NodeFlags.HasEmbeddedViews) {
|
||||||
|
@ -58,7 +58,7 @@ function defineTests(config: {directDom: boolean, viewFlags: number}) {
|
|||||||
])),
|
])),
|
||||||
]));
|
]));
|
||||||
|
|
||||||
const compView = view.nodes[1].componentView;
|
const compView = view.nodes[1].provider.componentView;
|
||||||
|
|
||||||
expect(compView.context).toBe(instance);
|
expect(compView.context).toBe(instance);
|
||||||
expect(compView.component).toBe(instance);
|
expect(compView.component).toBe(instance);
|
||||||
@ -85,7 +85,7 @@ function defineTests(config: {directDom: boolean, viewFlags: number}) {
|
|||||||
], update
|
], update
|
||||||
)),
|
)),
|
||||||
], jasmine.createSpy('parentUpdater')));
|
], jasmine.createSpy('parentUpdater')));
|
||||||
const compView = view.nodes[1].componentView;
|
const compView = view.nodes[1].provider.componentView;
|
||||||
|
|
||||||
checkAndUpdateView(view);
|
checkAndUpdateView(view);
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ export function main() {
|
|||||||
updater, inlineDynamic, view, 2,
|
updater, inlineDynamic, view, 2,
|
||||||
[callUpdater(updater, inlineDynamic, view, 1, values)]);
|
[callUpdater(updater, inlineDynamic, view, 1, values)]);
|
||||||
}));
|
}));
|
||||||
const service = view.nodes[2].provider;
|
const service = view.nodes[2].provider.instance;
|
||||||
|
|
||||||
values = [1, 2];
|
values = [1, 2];
|
||||||
checkAndUpdateView(view);
|
checkAndUpdateView(view);
|
||||||
@ -87,7 +87,7 @@ export function main() {
|
|||||||
updater, inlineDynamic, view, 2,
|
updater, inlineDynamic, view, 2,
|
||||||
[callUpdater(updater, inlineDynamic, view, 1, values)]);
|
[callUpdater(updater, inlineDynamic, view, 1, values)]);
|
||||||
}));
|
}));
|
||||||
const service = view.nodes[2].provider;
|
const service = view.nodes[2].provider.instance;
|
||||||
|
|
||||||
values = [1, 2];
|
values = [1, 2];
|
||||||
checkAndUpdateView(view);
|
checkAndUpdateView(view);
|
||||||
@ -126,7 +126,7 @@ export function main() {
|
|||||||
updater, inlineDynamic, view, 3,
|
updater, inlineDynamic, view, 3,
|
||||||
[callUpdater(updater, inlineDynamic, view, 2, values)]);
|
[callUpdater(updater, inlineDynamic, view, 2, values)]);
|
||||||
}));
|
}));
|
||||||
const service = view.nodes[3].provider;
|
const service = view.nodes[3].provider.instance;
|
||||||
|
|
||||||
values = [1, 2];
|
values = [1, 2];
|
||||||
checkAndUpdateView(view);
|
checkAndUpdateView(view);
|
||||||
|
@ -84,8 +84,8 @@ export class AppModule {
|
|||||||
}
|
}
|
||||||
bootstrap() {
|
bootstrap() {
|
||||||
this.rootView = createRootView(new DefaultServices(null, this.sanitizer), TreeComponent_Host);
|
this.rootView = createRootView(new DefaultServices(null, this.sanitizer), TreeComponent_Host);
|
||||||
this.rootComp = this.rootView.nodes[1].provider;
|
this.rootComp = this.rootView.nodes[1].provider.instance;
|
||||||
this.rootEl = this.rootView.nodes[0].renderNode;
|
this.rootEl = this.rootView.nodes[0].elementOrText.node;
|
||||||
}
|
}
|
||||||
tick() { checkAndUpdateView(this.rootView); }
|
tick() { checkAndUpdateView(this.rootView); }
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user