Angular项目中迭代生成的树,激活选中的节点,并将节点数据发送到父节点
从后台返回的数据,还有多层子节点,需要一个生成树的组件,如果直接在页面上写循环来拼接感觉会很麻烦,因为数据的层级结构不固定。
参考网上其他人的方法,整理如下:
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项目中迭代生成的树,激活选中的节点,并将节点数据发送到父节点的更多相关文章
- angular项目中各个文件的作用
原文地址 https://www.jianshu.com/p/176ea79a7101 大纲 1.对angular项目中的一些文件的概述 2.对其中一些文件的详细描述 2.1.package.json ...
- gulp 在 angular 项目中的使用
gulp 在 angular 项目中的使用 keyword:gulp,angularjs,ng,ngAnnotate,jshint,gulpfile 最后附完整简洁的ng项目gulpfile.js 准 ...
- Angular 项目中如何使用 ECharts
在有些使用 ECharts 库的 Angular 项目中,通常除了安装 npm 包之外,还会在 angular.json 中配置 “build.options.scripts”,将 “node_mod ...
- angular项目中遇到的问题
一.angular项目中如何实现路由缓存 需要实现的效果,对请求的数据进行缓存,比如进入文章详情页之后点击返回,不会再调用后台数据接口:而是加载缓存中的数据,如何数据变动的情况下,可使用下拉刷新刷新页 ...
- angular项目中使用Primeng
1.第一步把依赖添加到项目中 npm install primeng --save npm install @angular/animations --save npm install font-aw ...
- Angular项目中引入jQuery
npm install --save jquery npm install @types/jquery --save 在对应的组件中引入 import * as $ from "jquery ...
- 在angular项目中使用bootstrap的tooltip插件时,报错Property 'tooltip' does no t exist on type 'JQuery<HTMLElement>的解决方法和过程
在angular4的项目中需要使用bootstrap的tooltip插件. 1. 使用命令安装jQuery和bootstrap npm install bootstrap jquery --save ...
- 在UniApp的H5项目中,生成二维码和扫描二维码的操作处理
在我们基于UniApp的H5项目中,需要生成一些二维码进行展示,另外也需要让用户可以扫码进行一定的快捷操作,本篇随笔介绍一下二维码的生成处理和基于H5的扫码进行操作.二维码的生成,使用了JS文件wea ...
- 初学angular项目中遇到的一些问题
1.当angular渲染完成后操作DOM树方法 //当数据渲染完毕 ngApp.directive('repeatFinish', function () { return { ...
随机推荐
- MISC_刷题笔记
图片隐写 png类型 查看文件头文件尾,更改长宽(bugku_隐写) zip类型 压缩包的多层嵌套,用strings看打印出来的是不是一个目录的样子(bugku_眼见非实)
- 公司-IT-Mercari:Mercari 百科
ylbtech-公司-IT-Mercari:Mercari 百科 Mercari是一个日本C2C二手交易平台.拥有针对智能手机的C2C(个人与个人之间的电子商务)二手交易APP,此外还提供针对书籍与C ...
- bat 需注意
1. 注释 :: 注释内容,下一行不能是空行,必须是语句否则报错. goto blabla rem 注释内容,则无上述限制. goto blabla 2. if rem 1. 要注意左括号前的空格以及 ...
- 我的WordPress站点
读取VDI文件 SSL和TLS Windows下使用vim的最佳方案:Sublime gdb用法 VMware的Guest与Host进行通信的三种方式 加密与解密 漫谈保护模式 processing学 ...
- QTP场景恢复函数
public Function RecoveryFunction1(Object, Method, Arguments, retVal) Dim FileName ,TimeNow, ResPath ...
- js获取下拉框的value值
var Resultstr=""; var param = { action: "MoneyList" };//参数拼接 $.ajax({ type: &quo ...
- spring注解开发:容器中注册组件方式
1.包扫描+组件标注注解 使用到的注解如下,主要针对自己写的类 @Controller @Service @Repository @Component @ComponentScan 参考 spring ...
- python小学堂-基础调用
tem='xiaoq {0}iang'print(tem.capitalize())#首字母大学print(tem.center(30)) #居中显示iprint(tem.endswith(" ...
- Java原理领悟-线程池(Executor)
线程池全面解析 什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用. 线程池的好处 我 ...
- 48.Course Schedule(课程安排)
Level: Medium 题目描述: There are a total of n courses you have to take, labeled from 0 to n-1. Some c ...