从数据 API 动态创建递归树视图的最佳方法

2024-02-12

我正在学习 Angular 2,尝试从(可能非常大)第三方 API 构建可扩展的树视图。该 API 的底层结构如下:

- Home (id: 1053)
- - Rugby League (id: 1054)
- - - Super League (id: 1103)
- - - - Castleford Tigers (id: 1111)
- - - - Catalans Dragons (id: 1110)
- - - - Huddersfield Giants (id: 1116)
- - - - Hull FC (id: 1108)
- - - Championship (id: 1104)
- - - - Batley Bulldogs (id: 1120)
- - - - Bradford Bulls (id: 1118)
- - - - Dewsbury Rams (id: 1124)
- - - - Featherstone Rovers (id: 1121)
- - Football (id: 1056)
- - - Premier League (id: 1057)
- - - - AFC Bournemouth (id: 1059)
- - - - etc
- - - - etc

API 的设置是这样的:我传递一个 id,它返回该节点(仅)子节点的简单 JSON 数组。因此,例如我调用:http://www.example.com/api/contentNodes/?parentId=1053它返回:

[
  {"Id":1054,"Name":"Rugby League","HasChildren":true},
  {"Id":1056,"Name":"Football","HasChildren":true}
]

(HasChildren表示该节点是否有子节点。)

请注意,因为数据集最终会很大,所以我想在打开树枝时逐渐从 API 中“拉入”更多数据,而不是将整个数据集转储到其中并在我的应用程序中渲染出来。

我已经设置了一个 Angular 2 应用程序,可以在此处看到:http://plnkr.co/edit/QQ1OKCbd4pDptpSVbWch?p=preview http://plnkr.co/edit/QQ1OKCbd4pDptpSVbWch?p=preview

关键组件是“app/content-list.component.ts”文件:

import {Component, OnInit}  from 'angular2/core';
import {ContentNode}        from './content-node';
import {ContentService}     from './content.service';

@Component({
    selector: 'content-list',
    template: `
        <ol class="tree">
            <li *ngFor="#contentNode of contentNodes" class="tree__branch" [ngClass]="{'tree__branch--has-children': contentNode.HasChildren}">
                <a *ngIf="contentNode.HasChildren" (click)="toggleBranch(contentNode.Id)" class="toggle">+</a> {{ contentNode.Name }}
            </li>
        </ol>
        <div class="error" *ngIf="errorMessage">{{errorMessage}}</div>
    `
})
export class ContentListComponent implements OnInit {

    constructor (private _contentService: ContentService) {}

    errorMessage: string;
    private _startNodeId: number = 1053;

    contentNodes: ContentNode[];

    ngOnInit() { 
        this.getContentNodes();
    }

    getContentNodes() {
        this._contentService.getContentNodes(this._startNodeId)
            .subscribe(
                contentNodes => this.contentNodes = contentNodes,
                error =>  this.errorMessage = <any>error
            );
    }

    toggleBranch(branchId:number){
        console.log('branchId: ' + branchId);
    }
}

您将在此处看到,我正在调用我的服务,该服务通过传递 1053 的 ParentId 来返回 JSON。

现在,我在能够逐步加载树视图的子节点方面遇到了困难。+单击按钮,进入嵌套 HTML 列表(<ol>).

以一种非常巧妙的方式实现这一目标的最佳方法是什么?

我的下一步将是确保应用程序不会进行过多的 API 调用,但我最关心的是让正在运行的树视图连接起来并正常工作。

我见过这个递归树视图的例子 http://www.syntaxsuccess.com/viewarticle/recursive-treeview-in-angular-2.0但似乎(a)有点问题(因为有空<ol></ol>当子节点为空时在 HTML 中呈现的元素等); (b)它似乎是以一种非常“硬编码”的方式设置的,而且我没有足够的经验来自信地重构它。

非常感谢。

请注意,不幸的是,出于安全原因,我无法向公共请求开放 API,我意识到这使得在 Plunkr 上进行测试变得有点困难。目前,我的示例仅使用静态、单级 JSON 数据集。


在 Angular2 中,你可以递归地渲染指令。这使得渲染树变得非常容易。 我修改了你的Plunker http://plnkr.co/edit/vd9XXAQTHXxkCXaSjUHb?p=preview只是为了说明这一点。这不是理想的实现,但它按预期工作:)。

Example:

@Component({
    selector: 'tree-view',
    template: `
        <div *ngFor="#dir of dirs">
            <tree-view [dirs]="dir.dirs"></tree-view>
        <div>
    `,
    directives: [TreeView]
})
export class TreeView {
    @Input() 
    private dirs: Array<Directory>;
}

我希望你会喜欢。

Cheers!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从数据 API 动态创建递归树视图的最佳方法 的相关文章

随机推荐

  • 查询语言:参考查询请求

    跟着教程 有一个查询 query selectCommoditiesByOwner description Select all commodities based on their owner statement SELECT org a
  • 在 Ruby 中生成独立的线程或进程

    我可能会朝错误的方向接近这个问题 所以任何帮助将不胜感激 我有一个 Ruby 脚本 除其他外 它还启动一个可执行文件 我想启动这个可执行文件 当前正在使用系统 触发 然后继续执行脚本 当脚本完成时 我希望它退出但保持可执行文件运行 最初我有
  • 将一种模型转换为另一种模型的设计模式

    基本上 我的应用程序中有许多对象 我必须在发送请求之前将它们转换为另一个第三方对象 收到响应后 我必须将这些对象转换回我的应用程序支持的对象 在 Java 中 我可以使用什么模式将一个模型对象转换为另一个模型对象 我不认为有一个特定的模式
  • 如何从单个项目列表中删除未命名的元素?

    这听起来可能是一个非常初学者的问题 而且也可能是一个非常基本和愚蠢的问题 但不知怎的 我在做这件事时感到头疼 假设我有一个项目列表 v lt as list 1 2 3 v 1 1 1 2 3 现在我想将其所有项目拆分为单独的项目 v2 l
  • SQL - 查找只喜欢同一年级学生的学生的年级

    我正在做一门免费的斯坦福在线课程 这很酷 你应该看看 在过去的两天里我一直在绞尽脑汁 但找不到以下问题的答案 请帮忙 问题4 查找只有同年级朋友的学生的姓名和成绩 返回按年级排序的结果 然后按每个年级中的名称排序 当我最终认为我得到了答案时
  • HttpSessionListener 中的 sessionCreated() 是否自动与 request.getSession() 同步?

    Is sessionCreated 方法从HttpSessionListener自动同步于request getSession 称呼 特别是 我想知道在中设置会话属性是否是线程安全的sessionCreated 方法并检索属性request
  • Twitter bootstrap 轮播消失

    我想这可能是一个简单的问题 但我似乎无法弄清楚这一点 最好的解释方式就是让你看到 Link http dynastyfireplaces 3dcartstores com http dynastyfireplaces 3dcartstore
  • 如何在 Android 上的 WebView 中允许 HTTP 连接(而不是 HTTPS)?

    我有一个WebViewAndroid 上的应用程序 我想从使用的资源中获取数据HTTP仅有的 为此 我使用XMLHttpRequestJavaScript 中的 API 当我从其他任何地方获取数据时HTTPS resource 一切都好 但
  • 切换 JavaScript 函数

    我正在使用此代码来启动日志文件 function startTail str if str stop stopTail else t setTimeout getLog 1000 这称为使用
  • Android 布局 - 以编程方式设置自定义布局组件的值

    我定义了一个简单的自定义布局 其中包括文本视图和图像视图 在我的主布局中 我想多次使用此布局 并且想为代码中的这些文本和图像视图添加值 现在手动 但后来通过从数据库获取数据 我如何在我的代码中访问这些组件 这是我的主要布局 xml 文件
  • 用于多个可见 HTML 元素的 Aria 两种方式标签

    我有一组可以相互影响的元素 div class cont a href Click Me a span Count span class count span span span Count span class count span sp
  • 异步回发后性能下降 - 滚动变得可怕

    我的任务是帮助提高 ASP NET 4 5 Web 表单应用程序的性能 不幸的是 该应用程序使用了 updatepanel 他们真的很邪恶 http encosia com why aspnet ajax updatepanels are
  • 如何部署具有多个验证器的超级账本锯齿网络?

    我正在尝试至少配置一个锯齿网络2 验证者和一些事务处理器 我使用的是 Ubuntu 18 04 所以唯一可能的解决方案是使用 docker 我搜索了一整天的工作示例 但仍然没有运气 官网上有一个例子here https sawtooth h
  • iOS 中 UITableView 的展开/折叠部分

    有人可以告诉我执行方法吗UITableView可展开 可折叠动画sections of UITableView如下 or 您必须创建自己的自定义标题行并将其作为每个部分的第一行 子类化UITableView或者已经存在的标题会很痛苦 根据他
  • 在 apex salesforce 中调试可计划作业

    我正在尝试运行一个可调度的作业我从未在 salesforce 中使用过可调度的作业 这是我的代码 global class scheduledMerge implements Schedulable global void execute
  • 在不同的远程结账分支

    我有一个带有另一个遥控器的存储库upstream除了origin 我可以git checkout origin master 但是当我跑步时git checkout upstream master I get error pathspec
  • 在 R 中操作子矩阵

    Nh lt matrix c 17 26 30 17 23 17 24 23 nrow 2 ncol 4 Nh Sh lt matrix c 8 290133 6 241174 6 096808 7 4449672 6 894924 7 6
  • SwipeItem XAML 绑定被忽略

    我无法让任何绑定适用于SwipeItem在一个RadListView 这类似于标准ListView 特别是 我试图绑定到Command财产 但是 我尝试绑定到其他属性 例如 Text 但无济于事
  • 跨多个 PdfPCell 的 iText RadioGroup/RadioButtons

    我想制作一个包含多行的 PdfPTable 在每一行中 我希望第一个单元格中有一个单选按钮 第二个单元格中有一个描述性文本 我希望所有单选按钮都属于同一单选按钮组 我过去曾使用 PdfPCell setCellEvent 和我自己的自定义
  • 从数据 API 动态创建递归树视图的最佳方法

    我正在学习 Angular 2 尝试从 可能非常大 第三方 API 构建可扩展的树视图 该 API 的底层结构如下 Home id 1053 Rugby League id 1054 Super League id 1103 Castlef