refactor(ivy): combine lifecycleStage with LViewFlags (#24263)

PR Close #24263
This commit is contained in:
Kara Erickson 2018-06-01 18:54:23 -07:00 committed by Victor Berchet
parent 44856bfc2f
commit cb65724761
3 changed files with 20 additions and 39 deletions

View File

@ -9,7 +9,8 @@
import {assertEqual} from './assert'; import {assertEqual} from './assert';
import {DirectiveDef} from './interfaces/definition'; import {DirectiveDef} from './interfaces/definition';
import {TNodeFlags} from './interfaces/node'; import {TNodeFlags} from './interfaces/node';
import {HookData, LView, LifecycleStage, TView} from './interfaces/view'; import {HookData, LView, LViewFlags, TView} from './interfaces/view';
/** /**
* If this is the first template pass, any ngOnInit or ngDoCheck hooks will be queued into * If this is the first template pass, any ngOnInit or ngDoCheck hooks will be queued into
@ -97,9 +98,9 @@ function queueDestroyHooks(def: DirectiveDef<any>, tView: TView, i: number): voi
* @param currentView The current view * @param currentView The current view
*/ */
export function executeInitHooks(currentView: LView, tView: TView, creationMode: boolean): void { export function executeInitHooks(currentView: LView, tView: TView, creationMode: boolean): void {
if (currentView.lifecycleStage === LifecycleStage.Init) { if (currentView.flags & LViewFlags.RunInit) {
executeHooks(currentView.directives !, tView.initHooks, tView.checkHooks, creationMode); executeHooks(currentView.directives !, tView.initHooks, tView.checkHooks, creationMode);
currentView.lifecycleStage = LifecycleStage.AfterInit; currentView.flags &= ~LViewFlags.RunInit;
} }
} }

View File

@ -13,7 +13,7 @@ import {LContainer} from './interfaces/container';
import {LInjector} from './interfaces/injector'; import {LInjector} from './interfaces/injector';
import {CssSelectorList, LProjection, NG_PROJECT_AS_ATTR_NAME} from './interfaces/projection'; import {CssSelectorList, LProjection, NG_PROJECT_AS_ATTR_NAME} from './interfaces/projection';
import {LQueries} from './interfaces/query'; import {LQueries} from './interfaces/query';
import {CurrentMatchesList, LView, LViewFlags, LifecycleStage, RootContext, TData, TView} from './interfaces/view'; import {CurrentMatchesList, LView, LViewFlags, RootContext, TData, TView} from './interfaces/view';
import {AttributeMarker, TAttributes, LContainerNode, LElementNode, LNode, TNodeType, TNodeFlags, LProjectionNode, LTextNode, LViewNode, TNode, TContainerNode, InitialInputData, InitialInputs, PropertyAliases, PropertyAliasValue, TElementNode,} from './interfaces/node'; import {AttributeMarker, TAttributes, LContainerNode, LElementNode, LNode, TNodeType, TNodeFlags, LProjectionNode, LTextNode, LViewNode, TNode, TContainerNode, InitialInputData, InitialInputs, PropertyAliases, PropertyAliasValue, TElementNode,} from './interfaces/node';
import {assertNodeType} from './node_assert'; import {assertNodeType} from './node_assert';
@ -240,7 +240,7 @@ export function leaveView(newView: LView, creationOnly?: boolean): void {
// Views are clean and in update mode after being checked, so these bits are cleared // Views are clean and in update mode after being checked, so these bits are cleared
currentView.flags &= ~(LViewFlags.CreationMode | LViewFlags.Dirty); currentView.flags &= ~(LViewFlags.CreationMode | LViewFlags.Dirty);
} }
currentView.lifecycleStage = LifecycleStage.Init; currentView.flags |= LViewFlags.RunInit;
currentView.bindingIndex = -1; currentView.bindingIndex = -1;
enterView(newView, null); enterView(newView, null);
} }
@ -303,7 +303,7 @@ export function createLView<T>(
const newView = { const newView = {
parent: currentView, parent: currentView,
id: viewId, // -1 for component views id: viewId, // -1 for component views
flags: flags | LViewFlags.CreationMode | LViewFlags.Attached, flags: flags | LViewFlags.CreationMode | LViewFlags.Attached | LViewFlags.RunInit,
node: null !, // until we initialize it in createNode. node: null !, // until we initialize it in createNode.
data: [], data: [],
directives: null, directives: null,
@ -315,7 +315,6 @@ export function createLView<T>(
bindingIndex: -1, bindingIndex: -1,
template: template, template: template,
context: context, context: context,
lifecycleStage: LifecycleStage.Init,
queries: null, queries: null,
injector: currentView && currentView.injector, injector: currentView && currentView.injector,
sanitizer: sanitizer || null sanitizer: sanitizer || null

View File

@ -87,23 +87,6 @@ export interface LView {
*/ */
cleanup: any[]|null; cleanup: any[]|null;
/**
* This number tracks the next lifecycle hook that needs to be run.
*
* If lifecycleStage === LifecycleStage.ON_INIT, the init hooks haven't yet been run
* and should be executed by the first r() instruction that runs OR the first
* cR() instruction that runs (so inits are run for the top level view before any
* embedded views).
*
* If lifecycleStage === LifecycleStage.CONTENT_INIT, the init hooks have been run, but
* the content hooks have not yet been run. They should be executed on the first
* r() instruction that runs.
*
* If lifecycleStage === LifecycleStage.VIEW_INIT, both the init hooks and content hooks
* have already been run.
*/
lifecycleStage: LifecycleStage;
/** /**
* The last LView or LContainer beneath this LView in the hierarchy. * The last LView or LContainer beneath this LView in the hierarchy.
* *
@ -188,16 +171,25 @@ export const enum LViewFlags {
* back into the parent view, `data` will be defined and `creationMode` will be * back into the parent view, `data` will be defined and `creationMode` will be
* improperly reported as false. * improperly reported as false.
*/ */
CreationMode = 0b0001, CreationMode = 0b00001,
/** Whether this view has default change detection strategy (checks always) or onPush */ /** Whether this view has default change detection strategy (checks always) or onPush */
CheckAlways = 0b0010, CheckAlways = 0b00010,
/** Whether or not this view is currently dirty (needing check) */ /** Whether or not this view is currently dirty (needing check) */
Dirty = 0b0100, Dirty = 0b00100,
/** Whether or not this view is currently attached to change detection tree. */ /** Whether or not this view is currently attached to change detection tree. */
Attached = 0b1000, Attached = 0b01000,
/**
* Whether or not the init hooks have run.
*
* If on, the init hooks haven't yet been run and should be executed by the first component that
* runs OR the first cR() instruction that runs (so inits are run for the top level view before
* any embedded views).
*/
RunInit = 0b10000,
} }
/** Interface necessary to work with view tree traversal */ /** Interface necessary to work with view tree traversal */
@ -421,17 +413,6 @@ export interface RootContext {
*/ */
export type HookData = (number | (() => void))[]; export type HookData = (number | (() => void))[];
/** Possible values of LView.lifecycleStage, used to determine which hooks to run. */
// TODO: Remove this enum when containerRefresh instructions are removed
export const enum LifecycleStage {
/* Init hooks need to be run, if any. */
Init = 1,
/* Content hooks need to be run, if any. Init hooks have already run. */
AfterInit = 2,
}
/** /**
* Static data that corresponds to the instance-specific data array on an LView. * Static data that corresponds to the instance-specific data array on an LView.
* *