Custom Templates
You can customize the tree's templates using embedded ng-template
tags
Demo
Note: Angular 2 vs. 4
In Angular 2 you should use
<template>
tag, whereas in Angular 4 it's<ng-template>
#treeNodeTemplate
Use #treeNodeTemplate
for the content of the node.
You will have access to the following variables:
node: of type TreeNode. Exposes many useful methods, as well as a data
attribute with the original node's data.
index: The index of the current node in the parent's children.
For example:
<tree-root [nodes]="nodes">
<ng-template #treeNodeTemplate let-node let-index="index">
<span>{{ node.data.name }}</span>
<button (click)="go($event)">Custom Action</button>
</ng-template>
</tree-root>
#treeNodeWrapperTemplate
This option is useful in case all you need to further customise the expander location and the node's event listeners.
Start by specifying the following template, and make sure the tree still renders as expected.
Then remove / change whatever you need:
<tree-root [nodes]="nodes">
<ng-template #treeNodeWrapperTemplate let-node let-index="index">
<div class="node-wrapper" [style.padding-left]="node.getNodePadding()">
<tree-node-expander [node]="node"></tree-node-expander>
<div class="node-content-wrapper"
[class.node-content-wrapper-active]="node.isActive"
[class.node-content-wrapper-focused]="node.isFocused"
(click)="node.mouseAction('click', $event)"
(dblclick)="node.mouseAction('dblClick', $event)"
(contextmenu)="node.mouseAction('contextMenu', $event)"
(treeDrop)="node.onDrop($event)"
[treeAllowDrop]="node.allowDrop"
[treeDrag]="node"
[treeDragEnabled]="node.allowDrag()">
<tree-node-content [node]="node" [index]="index"></tree-node-content>
</div>
</div>
</ng-template>
</tree-root>
#loadingTemplate
For asynchronous data loading, use #loadingTemplate
to customize the message that appears while loading the children.
For example:
<tree-root [nodes]="nodes">
<template #loadingTemplate>Loading, please hold....</template>
</tree-root>
#treeNodeFullTemplate
This option is useful in case all other customisation options are not suitable for you.
It allows for full customisation of the node, as it replaces the internal template for the TreeNode component.
Start by specifying the following template, and make sure the tree still renders as expected.
Then remove / change whatever you need:
<ng-template #treeNodeFullTemplate
let-node
let-index="index"
let-templates="templates">
<div
[class]="node.getClass()"
[class.tree-node]="true"
[class.tree-node-expanded]="node.isExpanded && node.hasChildren"
[class.tree-node-collapsed]="node.isCollapsed && node.hasChildren"
[class.tree-node-leaf]="node.isLeaf"
[class.tree-node-active]="node.isActive"
[class.tree-node-focused]="node.isFocused">
<tree-node-drop-slot
*ngIf="index === 0"
[dropIndex]="node.index"
[node]="node.parent">
</tree-node-drop-slot>
<tree-node-wrapper [node]="node" [index]="index" [templates]="templates">
</tree-node-wrapper>
<tree-node-children [node]="node" [templates]="templates">
</tree-node-children>
<tree-node-drop-slot [dropIndex]="node.index + 1" [node]="node.parent">
</tree-node-drop-slot>
</div>
</ng-template>
Note!
Do not remove
let-templates="templates"
and passing[templates]="templates"
totree-node-children
. If you do that, the children of your nodes will not receive the custom template you provided.
Updated less than a minute ago