Angular2+ 自定义Tree组件(参考Angular-material的CdkTree)

栏目: 编程语言 · AngularJS · 发布时间: 6年前

内容简介:为了方便, 本文所有的目前正在写一个在写之前我百度了一通,发现大部分文章的Tree组件实现都是把节点模板直接写在了组件里,类似下面

为了方便, 本文所有的 Angular 均表示Angula2及以上版本,对于使用 Angular1 / Angular.js 的读者可作为参考

前言

目前正在写一个 AngularMarkdown 编辑器,需要一个树形组件来写文件系统。刚好之前用过 Angular Material树形组件 ,就想照着写一个。毕竟直接把 Angular Material 引进来会多出其他用不到的组件,而且自己实现还能更深入学习 Angular

介绍

在写之前我百度了一通,发现大部分文章的Tree组件实现都是把节点模板直接写在了组件里,类似下面

<!--Tree组件-->
<tree>
    <tree-node></tree-node>
</tree>
<!--TreeNode组件-->
<tree-node>
    <!--本节点内容-->
    {{ nodeName }}
    <!--子节点-->
    <tree-node *ngIf="hasChildren">
    </tree-node>
<tree-node>

说明一下: Tree 组件里面包含 TreeNode 组件, TreeNode 组件内部实现了递归子节点的逻辑。

其实这样的结构已经足够满足我的需求了,但是(因为强迫症)这样的可重用性几乎是没有,因为节点的内容已经写死在 TreeNode 组件里了。

然后我想到了 Angular MaterialCdkTree 。他的结构如下

<tree dataSource="ds">
    <tree-node>
        <!--本节点内容-->
        {{ nodeName }}
        <!--子节点出口-->
        <outlet></outlet>
    </tree-node>
</tree>

说明: 简单的说就是 CdkTree<tree-node> 里的内容作为一个模板保存起来,然后根据数据源递归渲染出来。这样我们就可以在不修改 TreeTreeNode 组件前提下改变其内容。

实现

在实现之前需要理解 Angular 的几个装饰器,学过 Angular 的应该都不会陌生。

@ViewChild
@ViewChildren
@ContentChild
@ContentChildren
View和Content的区别

View: 在组件的模板中定义的内容,即我们手动写在xxx.component.html里的内容

Content: 在 Host 元素的 <opening><closeing> 标签中的内容

概览

在Tree组件中有四个比较重要的类

@Component: TreeComponent
@Component: TreeNodeComponent
@Directive: TreeNodeOutletDirective
@Directive: TreeNodeDefDirective

TreeComponent

该组件就是我们要是实现的 Tree 组件,用于包裹 TreeNode

TreeNodeComponent

树节点组件,我们自定义的模板就写在这里面

TreeNodeOutletDirective

这个指令设置了子节点的出口位置

TreeNodeDefDirective

这个指令用来定义树节点所需的数据,即我们使用这个指令让模板可以使用每个树节点对应的数据

实现

我们先看一下完成后的样子

<nb-tree [dataSource]="fileTree">
    <nb-tree-node *nbTreeNodeDef="let data = data">
        <li>
          <span>{{ data.title }}</span>
        </li>
        <ul>
          <ng-container nbTreeNodeOutlet></ng-container>
        </ul>
    </nb-tree-node>
</nb-tree>

(标签前面的nb请忽略,这只是默认的前缀)上面是完成后的简易版。

我们可以看到在 tree 组件上设置了 dataSource

然后在 treeNodeDef 指令中我们导出了数据对象 data 。然后在模板中使用了它 <span>{{ data.title }}</span>

最后我们在 <ng-container> 上用 treeNodeOutlet 指令设置了子节点的出口。

懒得详细写实习了。。。有空再写吧。本文主要提供一个通用树形组件的思路。

想看代码的,看结尾。有一个不是很完善的 tree 组件,我用在正在写的Markdown编辑器上了。

结尾

Github: tree 组件链接


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Just My Type

Just My Type

Simon Garfield / Profile Books / 2010-10-21 / GBP 14.99

What's your type? Suddenly everyone's obsessed with fonts. Whether you're enraged by Ikea's Verdanagate, want to know what the Beach Boys have in common with easy Jet or why it's okay to like Comic Sa......一起来看看 《Just My Type》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具