2018-01-09 18:38:17 -08:00
|
|
|
/**
|
|
|
|
* @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
|
|
|
|
*/
|
|
|
|
|
2019-06-11 15:59:41 -07:00
|
|
|
import {ViewRef} from '../../linker/view_ref';
|
|
|
|
|
2019-03-20 15:26:48 +01:00
|
|
|
import {TNode} from './node';
|
2018-10-12 18:49:00 -07:00
|
|
|
import {RComment, RElement} from './renderer';
|
2020-01-13 15:12:16 -08:00
|
|
|
import {HOST, LView, NEXT, PARENT, T_HOST, TRANSPLANTED_VIEWS_TO_REFRESH} from './view';
|
2019-06-07 10:55:48 +02:00
|
|
|
|
2019-03-20 15:26:48 +01:00
|
|
|
|
2018-10-12 15:02:54 -07:00
|
|
|
|
2019-02-23 11:14:35 -08:00
|
|
|
/**
|
|
|
|
* Special location which allows easy identification of type. If we have an array which was
|
|
|
|
* retrieved from the `LView` and that array has `true` at `TYPE` location, we know it is
|
|
|
|
* `LContainer`.
|
|
|
|
*/
|
|
|
|
export const TYPE = 1;
|
2020-01-09 17:50:29 -08:00
|
|
|
|
2018-06-07 22:42:32 -07:00
|
|
|
/**
|
|
|
|
* Below are constants for LContainer indices to help us look up LContainer members
|
|
|
|
* without having to remember the specific indices.
|
|
|
|
* Uglify will inline these when minifying so there shouldn't be a cost.
|
|
|
|
*/
|
2020-05-12 10:35:52 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Flag to signify that this `LContainer` may have transplanted views which need to be change
|
|
|
|
* detected. (see: `LView[DECLARATION_COMPONENT_VIEW])`.
|
|
|
|
*
|
|
|
|
* This flag, once set, is never unset for the `LContainer`. This means that when unset we can skip
|
|
|
|
* a lot of work in `refreshDynamicEmbeddedViews`. But when set we still need to verify
|
|
|
|
* that the `MOVED_VIEWS` are transplanted and on-push.
|
|
|
|
*/
|
|
|
|
export const HAS_TRANSPLANTED_VIEWS = 2;
|
2019-06-07 10:55:48 +02:00
|
|
|
|
2020-01-13 15:12:16 -08:00
|
|
|
// PARENT, NEXT, TRANSPLANTED_VIEWS_TO_REFRESH are indices 3, 4, and 5
|
2018-11-21 21:14:06 -08:00
|
|
|
// As we already have these constants in LView, we don't need to re-create them.
|
2019-06-07 10:55:48 +02:00
|
|
|
|
|
|
|
// T_HOST is index 6
|
|
|
|
// We already have this constants in LView, we don't need to re-create it.
|
|
|
|
|
2019-02-23 11:14:35 -08:00
|
|
|
export const NATIVE = 7;
|
2019-06-11 15:59:41 -07:00
|
|
|
export const VIEW_REFS = 8;
|
2020-01-13 15:12:16 -08:00
|
|
|
export const MOVED_VIEWS = 9;
|
|
|
|
|
2019-04-29 21:17:13 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Size of LContainer's header. Represents the index after which all views in the
|
|
|
|
* container will be inserted. We need to keep a record of current views so we know
|
|
|
|
* which views are already in the DOM (and don't need to be re-added) and so we can
|
|
|
|
* remove views from the DOM when they are no longer required.
|
|
|
|
*/
|
2020-01-13 15:12:16 -08:00
|
|
|
export const CONTAINER_HEADER_OFFSET = 10;
|
2018-01-17 17:55:55 +01:00
|
|
|
|
2018-06-07 22:42:32 -07:00
|
|
|
/**
|
2018-10-12 18:49:00 -07:00
|
|
|
* The state associated with a container.
|
2018-06-07 22:42:32 -07:00
|
|
|
*
|
2018-11-21 21:14:06 -08:00
|
|
|
* This is an array so that its structure is closer to LView. This helps
|
2018-06-07 22:42:32 -07:00
|
|
|
* when traversing the view tree (which is a mix of containers and component
|
|
|
|
* views), so we can jump to viewOrContainer[NEXT] in the same way regardless
|
|
|
|
* of type.
|
|
|
|
*/
|
|
|
|
export interface LContainer extends Array<any> {
|
2019-02-23 09:45:55 -08:00
|
|
|
/**
|
|
|
|
* The host element of this LContainer.
|
|
|
|
*
|
|
|
|
* The host could be an LView if this container is on a component node.
|
|
|
|
* In that case, the component LView is its HOST.
|
|
|
|
*/
|
2019-05-28 10:31:01 -07:00
|
|
|
readonly[HOST]: RElement|RComment|LView;
|
2019-02-23 09:45:55 -08:00
|
|
|
|
2019-02-23 11:14:35 -08:00
|
|
|
/**
|
|
|
|
* This is a type field which allows us to differentiate `LContainer` from `StylingContext` in an
|
|
|
|
* efficient way. The value is always set to `true`
|
|
|
|
*/
|
|
|
|
[TYPE]: true;
|
|
|
|
|
2018-01-09 18:38:17 -08:00
|
|
|
/**
|
2020-05-12 10:35:52 -07:00
|
|
|
* Flag to signify that this `LContainer` may have transplanted views which need to be change
|
|
|
|
* detected. (see: `LView[DECLARATION_COMPONENT_VIEW])`.
|
2019-11-08 15:13:22 -08:00
|
|
|
*
|
2020-05-12 10:35:52 -07:00
|
|
|
* This flag, once set, is never unset for the `LContainer`.
|
2018-01-09 18:38:17 -08:00
|
|
|
*/
|
2020-05-12 10:35:52 -07:00
|
|
|
[HAS_TRANSPLANTED_VIEWS]: boolean;
|
2018-01-09 18:38:17 -08:00
|
|
|
|
|
|
|
/**
|
2018-06-07 22:42:32 -07:00
|
|
|
* Access to the parent view is necessary so we can propagate back
|
|
|
|
* up from inside a container to parent[NEXT].
|
2018-01-09 18:38:17 -08:00
|
|
|
*/
|
2019-01-28 14:45:31 -08:00
|
|
|
[PARENT]: LView;
|
2018-01-09 18:38:17 -08:00
|
|
|
|
|
|
|
/**
|
2018-06-07 22:42:32 -07:00
|
|
|
* This allows us to jump from a container to a sibling container or component
|
|
|
|
* view with the same parent, so we can remove listeners efficiently.
|
|
|
|
*/
|
2018-11-21 21:14:06 -08:00
|
|
|
[NEXT]: LView|LContainer|null;
|
2018-06-07 22:42:32 -07:00
|
|
|
|
2020-01-13 15:12:16 -08:00
|
|
|
/**
|
|
|
|
* The number of direct transplanted views which need a refresh or have descendants themselves
|
|
|
|
* that need a refresh but have not marked their ancestors as Dirty. This tells us that during
|
|
|
|
* change detection we should still descend to find those children to refresh, even if the parents
|
|
|
|
* are not `Dirty`/`CheckAlways`.
|
|
|
|
*/
|
|
|
|
[TRANSPLANTED_VIEWS_TO_REFRESH]: number;
|
|
|
|
|
2018-06-07 22:42:32 -07:00
|
|
|
/**
|
2019-06-07 10:55:48 +02:00
|
|
|
* A collection of views created based on the underlying `<ng-template>` element but inserted into
|
|
|
|
* a different `LContainer`. We need to track views created from a given declaration point since
|
|
|
|
* queries collect matches from the embedded view declaration point and _not_ the insertion point.
|
2018-01-09 18:38:17 -08:00
|
|
|
*/
|
2019-06-07 10:55:48 +02:00
|
|
|
[MOVED_VIEWS]: LView[]|null;
|
2019-02-23 11:14:35 -08:00
|
|
|
|
|
|
|
/**
|
2019-03-20 15:26:48 +01:00
|
|
|
* Pointer to the `TNode` which represents the host of the container.
|
2019-02-23 11:14:35 -08:00
|
|
|
*/
|
2019-03-20 15:26:48 +01:00
|
|
|
[T_HOST]: TNode;
|
2018-01-09 18:38:17 -08:00
|
|
|
|
2018-10-11 13:13:57 -07:00
|
|
|
/** The comment element that serves as an anchor for this LContainer. */
|
2019-02-23 11:14:35 -08:00
|
|
|
readonly[NATIVE]:
|
|
|
|
RComment; // TODO(misko): remove as this value can be gotten by unwrapping `[HOST]`
|
2019-06-11 15:59:41 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Array of `ViewRef`s used by any `ViewContainerRef`s that point to this container.
|
|
|
|
*
|
|
|
|
* This is lazily initialized by `ViewContainerRef` when the first view is inserted.
|
|
|
|
*/
|
|
|
|
[VIEW_REFS]: ViewRef[]|null;
|
2018-01-09 18:38:17 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Note: This hack is necessary so we don't erroneously get a circular dependency
|
|
|
|
// failure based on types.
|
|
|
|
export const unusedValueExportToPlacateAjd = 1;
|