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

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

内容简介:为了方便, 本文所有的目前正在写一个在写之前我百度了一通,发现大部分文章的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 组件链接


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

查看所有标签

猜你喜欢:

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

人工智能

人工智能

(美)GeorgeF.Luger / 郭茂祖;刘扬;玄萍;王春宇 / 机械工业出版社 / 2010-1 / 79.00元

《人工智能复杂问题求解的结构和策略(原书第6版)》是一本经典的人工智能教材,全面阐述了人工智能的基础理论,有效结合了求解智能问题的数据结构以及实现的算法,把人工智能的应用程序应用于实际环境中,并从社会和哲学、心理学以及神经生理学角度对人工智能进行了独特的讨论。新版中增加了对“基于随机方法的机器学习”的介绍,并提出了一些新的主题,如涌现计算、本体论、随机分割算法等。 《人工智能复杂问题求解的结......一起来看看 《人工智能》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器