docs(core): add comments to node_manipulation functions (#20855)
PR Close #20855
This commit is contained in:
parent
05953b3b83
commit
f3d38ce053
|
@ -11,6 +11,15 @@ import {ContainerState, LContainer, LElement, LNode, LNodeFlags, LProjection, LT
|
||||||
import {assertNodeType} from './node_assert';
|
import {assertNodeType} from './node_assert';
|
||||||
import {RComment, RElement, RNode, RText, Renderer3Fn} from './renderer';
|
import {RComment, RElement, RNode, RText, Renderer3Fn} from './renderer';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the closest DOM node above a given container in the hierarchy.
|
||||||
|
*
|
||||||
|
* This is necessary to add or remove elements from the DOM when a view
|
||||||
|
* is added or removed from the container. e.g. parent.removeChild(...)
|
||||||
|
*
|
||||||
|
* @param {LContainer} containerNode The container node whose parent must be found
|
||||||
|
* @returns {RNode}
|
||||||
|
*/
|
||||||
export function findNativeParent(containerNode: LContainer): RNode|null {
|
export function findNativeParent(containerNode: LContainer): RNode|null {
|
||||||
let container: LContainer|null = containerNode;
|
let container: LContainer|null = containerNode;
|
||||||
while (container) {
|
while (container) {
|
||||||
|
@ -32,6 +41,19 @@ export function findNativeParent(containerNode: LContainer): RNode|null {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the DOM element before which a certain view should be inserting its
|
||||||
|
* child elements.
|
||||||
|
*
|
||||||
|
* If the view has a next (e.g. for loop), elements should be inserted before
|
||||||
|
* the next view's first child element. Otherwise, the container's comment
|
||||||
|
* anchor is the marker.
|
||||||
|
*
|
||||||
|
* @param {number} index The index of the view to check
|
||||||
|
* @param {ContainerState} state ContainerState of the parent container
|
||||||
|
* @param {RComment} native Comment anchor for container
|
||||||
|
* @returns {RElement | RText | RComment}
|
||||||
|
*/
|
||||||
export function findBeforeNode(index: number, state: ContainerState, native: RComment): RElement|
|
export function findBeforeNode(index: number, state: ContainerState, native: RComment): RElement|
|
||||||
RText|RComment {
|
RText|RComment {
|
||||||
const children = state.children;
|
const children = state.children;
|
||||||
|
@ -41,6 +63,18 @@ export function findBeforeNode(index: number, state: ContainerState, native: RCo
|
||||||
native;
|
native;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds or removes all DOM elements associated with a view.
|
||||||
|
*
|
||||||
|
* Because some root nodes of the view may be containers, we sometimes need
|
||||||
|
* to propagate deeply into the nested containers to remove all elements in the
|
||||||
|
* views beneath it.
|
||||||
|
*
|
||||||
|
* @param {LContainer} container - The container to which the root view belongs
|
||||||
|
* @param {LView} rootNode - The view from which elements should be added or removed
|
||||||
|
* @param {boolean} insertMode - Whether or not elements should be added (if false, removing)
|
||||||
|
* @param {RNode} beforeNode - The node before which elements should be added, if insert mode
|
||||||
|
*/
|
||||||
export function addRemoveViewFromContainer(
|
export function addRemoveViewFromContainer(
|
||||||
container: LContainer, rootNode: LView, insertMode: true, beforeNode: RNode | null): void;
|
container: LContainer, rootNode: LView, insertMode: true, beforeNode: RNode | null): void;
|
||||||
export function addRemoveViewFromContainer(
|
export function addRemoveViewFromContainer(
|
||||||
|
@ -98,14 +132,17 @@ export function addRemoveViewFromContainer(
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Traverses the tree of component views and containers to remove listeners.
|
* Traverses the tree of component views and containers to remove listeners and
|
||||||
|
* call onDestroy callbacks.
|
||||||
*
|
*
|
||||||
* Notes:
|
* Notes:
|
||||||
* - Will be used for onDestroy calls later, so needs to be bottom-up.
|
* - Because it's used for onDestroy calls, it needs to be bottom-up.
|
||||||
* - Must process containers instead of their views to avoid splicing
|
* - Must process containers instead of their views to avoid splicing
|
||||||
* when views are destroyed and re-added.
|
* when views are destroyed and re-added.
|
||||||
* - Using a while loop because it's faster than recursing
|
* - Using a while loop because it's faster than recursion
|
||||||
* - Destroy only called on movement to sibling or movement to parent (laterally or up)
|
* - Destroy only called on movement to sibling or movement to parent (laterally or up)
|
||||||
|
*
|
||||||
|
* @param {ViewState} rootView - The view to destroy
|
||||||
*/
|
*/
|
||||||
export function destroyViewTree(rootView: ViewState): void {
|
export function destroyViewTree(rootView: ViewState): void {
|
||||||
let viewOrContainerState: ViewOrContainerState|null = rootView;
|
let viewOrContainerState: ViewOrContainerState|null = rootView;
|
||||||
|
@ -135,6 +172,19 @@ export function destroyViewTree(rootView: ViewState): void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts a view into a container.
|
||||||
|
*
|
||||||
|
* This adds the view to the container's array of active children in the correct
|
||||||
|
* position. It also adds the view's elements to the DOM if the container isn't a
|
||||||
|
* root node of another view (in that case, the view's elements will be added when
|
||||||
|
* the container's parent view is added later).
|
||||||
|
*
|
||||||
|
* @param {LContainer} container - The container into which the view should be inserted
|
||||||
|
* @param {LView} newView - The view to insert
|
||||||
|
* @param {number} index - The index at which to insert the view
|
||||||
|
* @returns {LView} - The inserted view
|
||||||
|
*/
|
||||||
export function insertView(container: LContainer, newView: LView, index: number): LView {
|
export function insertView(container: LContainer, newView: LView, index: number): LView {
|
||||||
const state = container.data;
|
const state = container.data;
|
||||||
const children = state.children;
|
const children = state.children;
|
||||||
|
@ -169,7 +219,17 @@ export function insertView(container: LContainer, newView: LView, index: number)
|
||||||
return newView;
|
return newView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a view from a container.
|
||||||
|
*
|
||||||
|
* This method splices the view from the container's array of active children. It also
|
||||||
|
* removes the view's elements from the DOM and conducts cleanup (e.g. removing
|
||||||
|
* listeners, calling onDestroys).
|
||||||
|
*
|
||||||
|
* @param {LContainer} container - The container from which to remove a view
|
||||||
|
* @param {number} removeIndex - The index of the view to remove
|
||||||
|
* @returns {LView} - The removed view
|
||||||
|
*/
|
||||||
export function removeView(container: LContainer, removeIndex: number): LView {
|
export function removeView(container: LContainer, removeIndex: number): LView {
|
||||||
const children = container.data.children;
|
const children = container.data.children;
|
||||||
const viewNode = children[removeIndex];
|
const viewNode = children[removeIndex];
|
||||||
|
@ -184,11 +244,31 @@ export function removeView(container: LContainer, removeIndex: number): LView {
|
||||||
return viewNode;
|
return viewNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a next on the view node, so views in for loops can easily jump from
|
||||||
|
* one view to the next to add/remove elements. Also adds the ViewState (view.data)
|
||||||
|
* to the view tree for easy traversal when cleaning up the view.
|
||||||
|
*
|
||||||
|
* @param {LView} view - The view to set up
|
||||||
|
* @param {LView} next - The view's new next
|
||||||
|
*/
|
||||||
export function setViewNext(view: LView, next: LView | null): void {
|
export function setViewNext(view: LView, next: LView | null): void {
|
||||||
view.next = next;
|
view.next = next;
|
||||||
view.data.next = next ? next.data : null;
|
view.data.next = next ? next.data : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines which ViewOrContainerState to jump to when traversing back up the
|
||||||
|
* tree in destroyViewTree.
|
||||||
|
*
|
||||||
|
* Normally, the view's parent ViewState should be checked, but in the case of
|
||||||
|
* embedded views, the container (which is the view node's parent, but not the
|
||||||
|
* ViewState's parent) needs to be checked for a possible next property.
|
||||||
|
*
|
||||||
|
* @param {ViewOrContainerState} state - The ViewOrContainerState for which we need a parent state
|
||||||
|
* @param {ViewState} rootView - The rootView, so we don't propagate too far up the view tree
|
||||||
|
* @returns {ViewOrContainerState}
|
||||||
|
*/
|
||||||
export function getParentState(
|
export function getParentState(
|
||||||
state: ViewOrContainerState, rootView: ViewState): ViewOrContainerState|null {
|
state: ViewOrContainerState, rootView: ViewState): ViewOrContainerState|null {
|
||||||
let node;
|
let node;
|
||||||
|
@ -203,7 +283,11 @@ export function getParentState(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Removes all listeners and call all onDestroys in a given view. */
|
/**
|
||||||
|
* Removes all listeners and call all onDestroys in a given view.
|
||||||
|
*
|
||||||
|
* @param {ViewState} viewState - The ViewState of the view to clean up
|
||||||
|
*/
|
||||||
function cleanUpView(viewState: ViewState): void {
|
function cleanUpView(viewState: ViewState): void {
|
||||||
if (!viewState.cleanup) return;
|
if (!viewState.cleanup) return;
|
||||||
const cleanup = viewState.cleanup !;
|
const cleanup = viewState.cleanup !;
|
||||||
|
@ -218,6 +302,19 @@ function cleanUpView(viewState: ViewState): void {
|
||||||
viewState.cleanup = null;
|
viewState.cleanup = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends the provided child element to the provided parent, if appropriate.
|
||||||
|
*
|
||||||
|
* If the parent is a view, the element will be appended as part of viewEnd(), so
|
||||||
|
* the element should not be appended now. Similarly, if the child is a content child
|
||||||
|
* of a parent component, the child will be appended to the right position later by
|
||||||
|
* the content projection system. Otherwise, append normally.
|
||||||
|
*
|
||||||
|
* @param {LNode} parent - The parent to which to append the child
|
||||||
|
* @param {RNode} child - The child that should be appended
|
||||||
|
* @param {ViewState} currentView - The current view's ViewState
|
||||||
|
* @returns {boolean} - Whether or not the child was appended
|
||||||
|
*/
|
||||||
export function appendChild(parent: LNode, child: RNode | null, currentView: ViewState): boolean {
|
export function appendChild(parent: LNode, child: RNode | null, currentView: ViewState): boolean {
|
||||||
// Only add native child element to parent element if the parent element is regular Element.
|
// Only add native child element to parent element if the parent element is regular Element.
|
||||||
// If parent is:
|
// If parent is:
|
||||||
|
@ -242,7 +339,18 @@ export function appendChild(parent: LNode, child: RNode | null, currentView: Vie
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function insertChild(node: LNode, currentView: ViewState) {
|
/**
|
||||||
|
* Inserts the provided node before the correct element in the DOM, if appropriate.
|
||||||
|
*
|
||||||
|
* If the parent is a view, the element will be inserted as part of viewEnd(), so
|
||||||
|
* the element should not be inserted now. Similarly, if the child is a content child
|
||||||
|
* of a parent component, the child will be inserted to the right position later by
|
||||||
|
* the content projection system. Otherwise, insertBefore normally.
|
||||||
|
*
|
||||||
|
* @param {LNode} node - Node to insert
|
||||||
|
* @param {ViewState} currentView - The current view's ViewState
|
||||||
|
*/
|
||||||
|
export function insertChild(node: LNode, currentView: ViewState): void {
|
||||||
const parent = node.parent !;
|
const parent = node.parent !;
|
||||||
// Only add child element to parent element if the parent element is regular Element.
|
// Only add child element to parent element if the parent element is regular Element.
|
||||||
// If parent is:
|
// If parent is:
|
||||||
|
@ -270,9 +378,19 @@ export function insertChild(node: LNode, currentView: ViewState) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends a projected node to the DOM, or in the case of a projected container,
|
||||||
|
* appends the nodes from all of the container's active views to the DOM. Also stores the
|
||||||
|
* node in the given projectedNodes array.
|
||||||
|
*
|
||||||
|
* @param {ProjectionState} projectedNodes - Array to store the projected node
|
||||||
|
* @param {LElement | LText | LContainer} node - The node to process
|
||||||
|
* @param {LView | LElement} currentParent - The last parent element to be processed
|
||||||
|
* @param {ViewState} currentView - The current view's ViewState
|
||||||
|
*/
|
||||||
export function processProjectedNode(
|
export function processProjectedNode(
|
||||||
projectedNodes: ProjectionState, node: LElement | LText | LContainer,
|
projectedNodes: ProjectionState, node: LElement | LText | LContainer,
|
||||||
currentParent: LView | LElement, currentView: ViewState) {
|
currentParent: LView | LElement, currentView: ViewState): void {
|
||||||
if ((node.flags & LNodeFlags.TYPE_MASK) === LNodeFlags.Container &&
|
if ((node.flags & LNodeFlags.TYPE_MASK) === LNodeFlags.Container &&
|
||||||
(currentParent.flags & LNodeFlags.TYPE_MASK) === LNodeFlags.Element &&
|
(currentParent.flags & LNodeFlags.TYPE_MASK) === LNodeFlags.Element &&
|
||||||
(currentParent.data === null || currentParent.data === currentView)) {
|
(currentParent.data === null || currentParent.data === currentView)) {
|
||||||
|
|
Loading…
Reference in New Issue