从后台返回的数据,还有多层子节点,需要一个生成树的组件,如果直接在页面上写循环来拼接感觉会很麻烦,因为数据的层级结构不固定。

参考网上其他人的方法,整理如下:

1. 创建一个用于循环迭代的组件,在父组件的元素上绑定需要递归的数据和递归组件的选择器。

<ul class="list-wrapper" [treeData]="circuitList" [originalData]="circuitList" (sendNode)="getCurrentNode($event)" tpl-tree-node></ul>

2. 在递归的子组件中接收父组件传入的数据,并在其模板中调用递归组件自身:

<li *ngFor="let item of treeData">
<a [ngClass]="{'active':item.active}" (click)="getCurrentNode(item)">
<span class="glyphicon mini-icon" *ngIf="item.children" (click)="toggleSubNode(item)"
[ngClass]="{'glyphicon-triangle-bottom':item.open,'glyphicon-triangle-right':!item.open}"></span>{{item.name}}</a>
<ul *ngIf="item.children" [ngClass]="{'show':item.open,'hidden':!item.open}" [treeData]="item.children"
(sendNode)="getCurrentNode($event)" [originalData]="treeData" tpl-tree-node></ul>
</li>

子组件的ts代码

import {Component, EventEmitter, Input, Output} from "@angular/core";

@Component({
selector: '[tpl-tree-node]',
templateUrl: './tpl-tree-node.component.html',
styleUrls: ['./tpl-tree-node.component.css']
})
export class TplTreeNodeComponent {
@Input() treeData = []; @Input() originalData; @Output() sendNode: EventEmitter<any> = new EventEmitter<any>(); constructor() {
} getCurrentNode(item) {
this._formatList(this.originalData);
item.active = true;
this.sendNode.emit(item);
} private _formatList(arr) {
arr.forEach(node => {
node.active = false;
if (node.children) this._formatList(node.children);
});
} toggleSubNode(item) {
item.open = !item.open;
}
}

按照以上,树组件已经可以正常生成。

同时在点击节点时添加一个激活的样式,取消掉其他节点的激活样式,并将节点对应的数据发送到父组件。

这里比较特别的是递归组件的选择器的定义:

selector: '[tpl-tree-node]',

3. 与参考链接里面不同的是,多定义了一个@Input() originalData,并在子组件中也绑定了这个属性。

这里是为了取消其他树节点的激活样式。不绑定这个初始数据的话,节点点击时,传入的treeData会变成绑定的item.children的数据。即只处理当前节点并列及以下子节点的状态。

4. 从子组建中发送事件到父组件时,一开始没有在子组件内部迭代的部分也绑定事件,导致部分子节点不会发送事件。

参考链接:https://blog.csdn.net/oneloser/article/details/92086914

Angular项目中迭代生成的树,激活选中的节点,并将节点数据发送到父节点的更多相关文章

  1. angular项目中各个文件的作用

    原文地址 https://www.jianshu.com/p/176ea79a7101 大纲 1.对angular项目中的一些文件的概述 2.对其中一些文件的详细描述 2.1.package.json ...

  2. gulp 在 angular 项目中的使用

    gulp 在 angular 项目中的使用 keyword:gulp,angularjs,ng,ngAnnotate,jshint,gulpfile 最后附完整简洁的ng项目gulpfile.js 准 ...

  3. Angular 项目中如何使用 ECharts

    在有些使用 ECharts 库的 Angular 项目中,通常除了安装 npm 包之外,还会在 angular.json 中配置 “build.options.scripts”,将 “node_mod ...

  4. angular项目中遇到的问题

    一.angular项目中如何实现路由缓存 需要实现的效果,对请求的数据进行缓存,比如进入文章详情页之后点击返回,不会再调用后台数据接口:而是加载缓存中的数据,如何数据变动的情况下,可使用下拉刷新刷新页 ...

  5. angular项目中使用Primeng

    1.第一步把依赖添加到项目中 npm install primeng --save npm install @angular/animations --save npm install font-aw ...

  6. Angular项目中引入jQuery

    npm install --save jquery npm install @types/jquery --save 在对应的组件中引入 import * as $ from "jquery ...

  7. 在angular项目中使用bootstrap的tooltip插件时,报错Property 'tooltip' does no t exist on type 'JQuery<HTMLElement>的解决方法和过程

    在angular4的项目中需要使用bootstrap的tooltip插件. 1. 使用命令安装jQuery和bootstrap npm install bootstrap jquery --save ...

  8. 在UniApp的H5项目中,生成二维码和扫描二维码的操作处理

    在我们基于UniApp的H5项目中,需要生成一些二维码进行展示,另外也需要让用户可以扫码进行一定的快捷操作,本篇随笔介绍一下二维码的生成处理和基于H5的扫码进行操作.二维码的生成,使用了JS文件wea ...

  9. 初学angular项目中遇到的一些问题

    1.当angular渲染完成后操作DOM树方法 //当数据渲染完毕 ngApp.directive('repeatFinish', function () {            return {  ...

随机推荐

  1. linux 文件及目录结构体系

    linux 目录的特点: 1). /是所有目录的顶点 2).目录结构像一颗倒挂的树 3).目录和磁盘分区是没有关联的 4)./下不同的目录可能对应不同的分区或磁盘 5).所有的目录都是按照一定的类别有 ...

  2. codeforces 111A/112C Petya and Inequiations

    题目:Petya and Inequiations传送门: http://codeforces.com/problemset/problem/111/A http://codeforces.com/p ...

  3. php关键字static使用

    php中static关键字使用: 情景1:静态变量 使用static关键字定义静态变量 静态变量:只存在于函数作用域内,也就是说,静态变量只存活在栈中.一般的函数内变量在函数结束后会释放,比如局部变量 ...

  4. Linux 学习 (五) DNS配置

    没有配置DNS会引起的问题 yum命令 ssh命令等不能进行 错误: Could not resolve host: centos.ustc.edu.cn; 本文例子: CentOS7 下DNS配置 ...

  5. appium 链接真机后,运行代码,但是APP并没有启动

    要淡定,链接真机后,问题一下多出来这么多,还没有启动程序,就碰到接二连三的问题. 爽到家了.慢慢解决吧. 具体问题是这样的: # coding=utf-8from appium import webd ...

  6. 110、TensorFlow张量值的计算

    import tensorflow as tf #placeholders在没有提供具体值的时候不能使用eval方法来计算它的值 # 另外的建模方法可能会使得模型变得复杂 # TensorFlow 不 ...

  7. 测开之路十六:@classmethod与@staticmethod

    @classmethod 类方法 和属性一样,所有实例化的对象都共享类方法 @staticmethod 静态方法,可以理解为和类没有任何关系,只是放在了类里面 参数可以任意定义,根据自己的定义传参,也 ...

  8. Javascript对checkbox勾选判断,错误提示和按钮变色操作

    同意相关条款未打钩时,登录按钮为灰色且无法提交,点击灰色的登录按钮提示同意相关条款,打钩后变成亮色且可以提交信息. 勾选框及文字: <div class="check-rule&quo ...

  9. 关于Java中编码集的有趣现象和解释

    这是在整理另一篇博客的时候发现的一个有趣的现象,是这样描述的:我们都知道Java默认使用的是UniCode编码集,我们也知道char类型占用两个字节.所以奇怪的现象又发生了(见代码): @Test p ...

  10. MongoDB拥有SSD秒杀高富帅使用过程分享

    [IT168现场报道]2013年4月18-20日,第四届中国数据库技术大会(DTCC 2013)在北京福朋喜来登酒店拉开序幕.在为期三天的会议中,大会将围绕大数据应用.数据架构.数据管理(数据治理). ...