Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >角8-递归实现具有动态展开和折叠的层次列表。

角8-递归实现具有动态展开和折叠的层次列表。
EN

Stack Overflow用户
提问于 2020-05-19 20:36:07
回答 1查看 862关注 0票数 0

我正在尝试构建一个分层展开/折叠列表来表示父级子关系。在初始加载时,将列出父节点。如果他们有孩子,则会显示一个克拉图标,否则就会显示一个子弹图标。单击克拉图标后,将发出API调用来检索数据,并显示子信息。再次单击同一克拉图标时,将不会进行API调用,但直接子列表将被隐藏。如果子节点是父节点,则应该递归地发生这种情况。

期望的初始加载行为:

单击克拉图标以展开:需要的行为:

JSON数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "page": {
        "results": [{
            "id": "1001",
            "title": "American",
            "children": {
                "page": {
                    "results": [{
                        "id": "1003",
                        "title": "Chevy",
                        "children": {
                            "page": {
                                "results": [],
                                "start": 0,
                                "limit": 25,
                                "size": 0
                            }
                        }
                    }],
                    "start": 0,
                    "limit": 25,
                    "size": 1
                }
            }
        }, {
            "id": "1002",
            "title": "German",
            "children": {
                "page": {
                    "results": [],
                    "start": 0,
                    "limit": 25,
                    "size": 0
                }
            }
        }],
        "start": 0,
        "limit": 2,
        "size": 2
    }
}

组件代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/throw';

import { WikiService } from '../wiki.service';
import { WikiTree } from '../../interfaces/WikiTree';
import { AppConfigService } from '../../services/app-config.service';

@Component({
  selector: 'app-wiki-tree-nav',
  templateUrl: './wiki-tree-nav.component.html',
  styleUrls: ['./wiki-tree-nav.component.css']
})
export class WikiTreeNavComponent implements OnInit {

  public wikiPageId: any = '1000';
  wikiTree$: Observable<WikiTree>;
  public resultsPage: any;

  constructor(private wikiService: WikiService, private route: ActivatedRoute,
    private appConfigService: AppConfigService) {
    this.route.params.subscribe(res => this.wikiPageId = res.id);
  }

  ngOnInit() {
      this.getWikiTree(0, 200, this.wikiPageId);
  }

  getWikiTree(start: number = 0, limit: number = 200, pageId: string = '') {
    this.wikiTree$ = this.wikiService.GetWikiTree(start, limit, pageId);
    this.wikiTree$.subscribe((data) => {
      this.resultsPage = data;
    },
      (err) => {
      }
    );
  }

  getCSSClass(pageId: string) {
    let cssClass = '';
    if (this.wikiPageId === pageId) {
      cssClass = 'boldTitle';
    }
    return cssClass;
  }

}

HTML代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ul *ngIf="wikiTree$ | async as wikiTree">
        <li *ngFor="let result of wikiTree.page.results; index as i" style="margin-bottom:10px;">
            <div>
                <span *ngIf="result.children.page.size==0" style="margin-left:4px;margin-right:4px;">
                    <clr-icon shape="circle" class="is-solid" size="6"></clr-icon>
                </span>
                <span *ngIf="result.children.page.size>0">
                    <a (click)="getWikiTree(0,200,result.id)">
                        <clr-icon shape="caret right" size="14"></clr-icon>
                    </a>
                </span>
                <span style="margin-left:5px;font-size:14px;" [ngClass]="getCSSClass(result?.id)">
                    <a href="/pages/{{result.id}}">{{result.title}}</a>
                </span>
            </div>
        </li>
    </ul>

我的当前HTML代码替换了整个树,而不是附加到父节点。如何实现角HTML代码来递归地执行展开和折叠?

EN

回答 1

Stack Overflow用户

发布于 2020-05-20 03:12:12

我去创建一个结构指令,所以我的app.component.html变成了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div recursive [children]="data" [search]="dataService.getData"></div>

在这里我定义了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  constructor(public dataService:DataService){}
  ngOnInit()
  {
    this.dataService.getData(0).subscribe(res=>this.data=res)
  }

我需要将"search“函数传递给递归组件,该组件返回一个可观察到的对象数组,对象具有属性'id‘、'label’和'hasChildren‘,以指示是否有子对象,例如,json响应类似于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[{id:1,label:'label1',hasChildren:true},{id:2,label:'label2'}]

在递归组件中,我喜欢定义为@Input()级别、子级和父级。正如您想要的那样,在单击获取“子”的函数时,我添加搜索,并在“打开”函数中更改属性"isOpen“并调用searchFunction。请注意,在管理组件的对象中,最初没有属性“子”或“isOpen”,我添加了以下“动态”

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component({
  selector: "[recursive]",
  templateUrl: "./tree-view.component.html",
  styleUrls: ["./tree-view.component.css"]
})
export class TreeViewComponent {
  @Input() level: number;
  @Input() children: any;
  @Input() parent: any;

  @Input() search: (any) => Observable<any>;

  self = this;
  open(item) {
    item.isOpen = !item.isOpen;
    if (!item.children) {
      item.loading="...."
      this.search(item.id).subscribe(res=>{
        item.loading=null
        item.children=res;
      })
    }
  }
}

在这种情况下,我们的树-view.html如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ul class="tree" *ngIf="level==undefined">
  <ng-container *ngTemplateOutlet="tree;context:{children:children,search:search}">
  </ng-container>
</ul>
<ng-container *ngIf="level!=undefined">
  <ng-container *ngTemplateOutlet="tree;context:{children:children,search:search}">
  </ng-container>
</ng-container>

<ng-template #tree let-children="children" let-search="search">
<li *ngFor="let item of children">
    <div (click)="item.hasChildren && open(item)">
     <span [ngClass]="!item.hasChildren?'doc':item.isOpen?'open':'close'" ></span>
     {{item.label}}{{item.loading}}
  </div>
    <ul recursive *ngIf="item.children && item.isOpen" 
        [children]="item.children" 
        [parent]="self" 
        [level]="level!=undefined?level+1:0"
        [search]="search"
        >
  </ul>
</li>
</ng-template>

stackblitz,我希望这对你有帮助

注意:我使用三个css类,.doc、.open和.close来指示树的状态,以及使用of和delay的“傻瓜”服务来模拟调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61905207

复制
相关文章
ExpandableListView实现商品列表折叠
简介 在日常的开发中,有可能会遇到需要一些可以展开的列表,比如QQ的好友列表,电商的购物车折叠显示。Android也给我们提供ExpandableListView类,完美实现这样类似的需求, 极大的方
xiangzhihong
2018/01/26
1.6K0
ExpandableListView实现商品列表折叠
简介 在日常的开发中,有可能会遇到需要一些可以展开的列表,比如QQ的好友列表,电商的购物车折叠显示。Android也给我们提供ExpandableListView类,完美实现这样类似的需求, 极大的方
xiangzhihong
2018/02/06
1.7K0
ExpandableListView实现商品列表折叠
层次树展开问题
在数据仓库的层次建模时,常用递归的方式表示一颗层次树,但有些BI工具的前端不支持递归,所以为了实现数据下钻,可以把一棵递归树进行扩展。
用户1148526
2019/05/25
5450
winform如何保持TreeView节点展开和折叠的状态
转载:http://blog.sina.com.cn/s/blog_6abcacf5010138q5.html
跟着阿笨一起玩NET
2018/09/19
2.5K0
QtCreator技巧-代码折叠/展开
1.光标指向对应的代码块操作ctrl + shift + <折叠代码块和ctrl + shift + >展开代码块; 2.edit(编辑)->advanved(高级)->Toggle Fold All(切换折叠所有); 3.在编辑界面点击行号所在的三角形图标可以折叠和展开代码。
Qt君
2019/07/15
4.4K0
QtCreator技巧-代码折叠/展开
点击展开显示折叠内容
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/111722.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/12
2.8K0
点击展开显示折叠内容
展开与折叠菜单动画
最简单的展开与折叠菜单,一般是通过切换display属性的none和block的值来实现。但是这样会使得整个过程非常的生硬,内容是一瞬间展示给用户,交互过程感觉不是特别好。我们加上动画以后让整个过程更加柔和。
_kyle
2020/08/24
3.7K0
展开与折叠菜单动画
Android-文本折叠点击展开
Demo:https://github.com/LonglyWolf/NavigationSystemHLJU
圆号本昊
2021/09/24
1.1K0
Android-文本折叠点击展开
递归和动态规划
算法中使用递归可以很简单地完成一些用循环实现的功能,比如二叉树的左中右序遍历。递归在算法中有非常广泛的使用, 包括现在日趋流行的函数式编程。
lucifer210
2019/09/04
7300
递归和动态规划
递归层次汇总查询
在一个数据仓库项目中,人员、组织机构、事实表是这样设计的: 组织机构是一个树形结构 每一个人员只属于一层组织机构,该层为叶子节点和非叶子节点均可 事实表存储每个人员的数据 要求按组织机构层次汇总数据,别且可下钻。 -- 建立测试表 -- 1. 组织机构 CREATE TABLE org ( org_id NUMBER, org_name VARCHAR2 (100), p_org_id NUMBER ); -- 2. 职员 CREATE TABLE emp
用户1148526
2019/05/25
8810
常见选项卡内容切换+折叠+展开效果实现
1.选项卡效果预览 2.源码与简要说明 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5
小蔚
2019/09/11
3.4K0
递归和动态规划
1,把问题转化为规模缩小了的同类问题的子问题 2,有明确的不需要继续进行递归的条件(base case) 3,有当得到了子问题的结果之后的决策过程 4,不记录每一个子问题的解
名字是乱打的
2022/05/13
1800
具有列表功能的有序字典实现 ListOrderedDict
在python编程中,遇到了字典需要有序的情况,可以使用 collections 库中的 OrderedDict,在保持字典功能的同时使得其元素保持输入顺序;
为为为什么
2022/08/06
8740
【Flutter】ExpansionTile 可折叠列表
文章目录 一、ExpansionTile 构造方法 二、完整代码示例 三、相关资源 一、ExpansionTile 构造方法 ---- 下面是 ExpansionTile 的构造方法 ; 其中 required this.title 是必须要设置的参数 ; class ExpansionTile extends StatefulWidget { /// Creates a single-line [ListTile] with a trailing button that expands or coll
韩曙亮
2023/03/29
1.4K0
【Flutter】ExpansionTile 可折叠列表
关于安卓开发实现可展开的列表组件
三个布局文件 main.xml      childs.xml      groups.xml 一个java文件  List_lianxi.java main.xml文件代码 1 <?xml ver
听着music睡
2018/05/18
1.1K0
Python 嵌套列表展开
问题1:对于列表形如 list_1 = [[1, 2], [3, 4, 5], [6, 7], [8], [9]] 转化成列表 list_2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 的问题。
py3study
2020/01/08
3K0
DP动态规划和递归
在刷leetcode的时候,因为对DP和递归不是很熟,对两者界限也很模糊。所以看了一些概念以后来写一个日记 DP动态规划:解决一类(离散)优化问题的思路的总称; 这是一类问题的定义,解决这类问题的核心在于找到递推公式 得到递推公式之后,如何计算递推公式存在两种方法:自顶向下和自底向上 自顶向下:能采用递归实现 int Fibonacci(int n) { if(n == 0) return 0; if(n == 1) return 1; ret
MarkZhou
2021/01/28
4180
点击加载更多

相似问题

以角展开/折叠递归树菜单中的列表项

10

动态展开和折叠Jquery

15

如何展开和折叠Kendo层次结构网格

10

如何使用胸腺叶实现列表的折叠和展开?

28

jQuery展开和折叠列表

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文