在使用递归模板表示的 n 元树中放置元素时,角度拖放不起作用

2024-02-09

我对有角度的材料拖放不熟悉。

我的应用程序正在使用 n 叉树,并且由于我不知道它的先验形式,因此我被迫使用递归模板来表示它。

在过去的几天里,我一直在尝试使用 Angular 材质拖放来重新排序兄弟姐妹。如果我删除根节点,一切都会正常工作,但我无法删除根节点,因为我需要它来遍历树以进行其他操作。

波纹管是树的简化形式。实际上,树可以有更多的树枝和叶子,但我想保持简单。

n 叉树的 Json(根节点以及我希望能够拖放的 3 个子节点):

[
  {
    "orderIndex": 0,
    "id": "5a4f87ce-c52d-4cc1-b587-21898ded5cc0",
    "parentId": "5a4f87ce-c52d-4cc1-b587-21898ded5cc0",
    "name": "Interface1",
    "conditions": "None",
    "text": null,
    "description": "description",
    "children": [
      {
        "orderIndex": 0,
        "id": "5a4f87ce-c527-4cc1-b587-22898ded5cc0",
        "parentId": "5a4f87ce-c52d-4cc1-b587-21898ded5cc0",
        "name": "Interface2",
        "conditions": "None",
        "text": null,
        "description": "description",
        "children": [],
        "errors": null
      },
      {
        "orderIndex": 1,
        "id": "5a4f87ce-c527-4cc8-b587-26898ded5cc0",
        "parentId": "5a4f87ce-c527-4cc8-b587-23898ded5cc0",
        "name": "Interface6",
        "conditions": "None",
        "text": null,
        "description": "description",
        "children": [],
        "errors": null
      },
      {
        "orderIndex": 2,
        "id": "5a4f87ce-c525-4cc1-b587-25898ded5cc0",
        "parentId": "5a4f87ce-c52e-4cc1-b587-24898ded5cc0",
        "name": "Interface4",
        "conditions": "None",
        "text": null,
        "description": "description",
        "children": [],
        "errors": null
      }
    ],
    "errors": null
  }
]

成分:

import { DataService } from './../data.service';
import { Node } from '../_Models/Node';
import {CdkDragDrop, moveItemInArray} from '@angular/cdk/drag-drop';

@Component({
  selector: 'app-vnf-main',
  templateUrl: './vnf-main.component.html',
  styleUrls: ['./vnf-main.component.css']
})
export class VnfMainComponent implements OnInit {
  tree: Node[];

  constructor(private dataService: DataService) {
  }

  ngOnInit() {
    this.dataService.tree$.subscribe(result => {
      this.tree = result;
    });

  drop(event: CdkDragDrop<Node[]>) {
    moveItemInArray(this.tree, event.previousIndex, event.currentIndex);
  }
}

模板代码:

<table>
     <ng-template #recursiveList let-tree>
         <div cdkDropList (cdkDropListDropped)="drop($event)">
             <div *ngFor="let node of tree; let i=index " cdkDrag>
                 <tr>
                    <app-default-node [node]="node"></app-default-node>
                    <td *ngIf="node.children!==null && node.children.length > 0" cdkDrag>
                        <ng-container *ngTemplateOutlet="recursiveList; context:{ $implicit: node.children }"></ng-container>
                    </td>
                 </tr>
             </div>
         </div>
     </ng-template>
</table>
<ng-container *ngTemplateOutlet="recursiveList; context:{ $implicit: tree }"></ng-container>

另外:我如何知道被拖动的节点以及它被删除的节点?我无法在任何地方找到答案,但如果我能得到这两个答案,我也许可以通过遍历树并手工完成所有事情来解决它。

预先感谢您到目前为止并阅读整个问题。


万一有些人遇到同样的问题...我通过使用将节点拖动到 drop 方法解决了这个问题[cdkDragData]=节点因为 cdk 拖放是为列表而不是 n 叉树设计的。

<div [cdkDragData]=node *ngFor="let node of tree; let i=index " cdkDrag>

然后,在方法内部,可以遍历树并“手动”进行更改:

const movedNode: Node = event.item.data; //Node that was dragged
const parentNode: Node = this.dataService.findNode(movedNode.parentId, this.tree[0]); //parent of the dragged node
moveItemInArray(parentNode.children, event.previousIndex, event.currentIndex); //move the node as in any other cdk drag and drop list

感谢我收到的答案,它真的鼓励我找到最好的解决方案????

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

在使用递归模板表示的 n 元树中放置元素时,角度拖放不起作用 的相关文章

随机推荐

  • 如何列出 Android 10 上的所有 pdf 文件?

    由于更改与访问共享存储的授权相关 因此似乎不再可能通过这种方法搜索 pdf 类型的所有文档 使用 requestLegacyExternalStorage false ContentResolver cr context getConten
  • 用 boost 精神解析布尔表达式

    我正在尝试使用 boostspirit 编写布尔表达式的解析器 我在 stackoverflow com 上找到了一个很好的例子 C 中的布尔表达式 语法 解析器 https stackoverflow com questions 8706
  • 如何制作累积序列?

    假设我有一个如下所示的惰性序列 def s iterate inc 1 take 10 s gt 1 2 3 4 5 6 7 8 9 10 现在 我想生成一个累积和的序列s像下面这样 gt 1 3 6 10 15 我怎样才能做到这一点 我尝
  • 如何使用 Promise 递归地读取目录树

    我正在尝试编写一个函数 该函数可以完成与使用带有承诺模式的回调模式编写的以下内容相同的功能 function readdirRecursive path handler callback var errs tree fs readdir p
  • 如何在 Windows 上启用 Docker Remote API

    我正在尝试在 Windows 10 主机上使用 Docker Remote API 我正在使用 Chrome 的 Postman 扩展来查看是否可以从 docker 远程 api 的端点获取结果 以下是我尝试过的端点 GET http 19
  • gridview的锁定滚动

    I have one gridview in my UI but it scrolls vertically I have set all the scrollbar properties as false but its still sc
  • FlatList scrollToIndex 使用 useRef 和 Typescript - 类型错误

    我正在使用 FlatList 我想创建一个引用 以便在按下一个按钮时能够滚动 FlatList 问题是我正在使用 Typescript 并且遇到一种我无法解决的类型错误 问题是 如何为 FlatList 引用创建接口 这里有一个我正在做的事
  • 在 Visual C++ 6.0 中查找源文件的预设位置

    由于我们的一些代码是遗留的 我们仍在使用 Microsoft Visual 6 0 SP6 当我第一次附加到正在运行的进程来调试它时 它不知道我闯入该进程时源文件所在的位置 因此 它要求我在给定源文件名的情况下导航到源树中的适当目录 它记住
  • 未指定输入文件 - apache 和 php-fastcgi

    我客户的网站当前运行在带有 mod php 的 apache 服务器上 所有应用程序的路由都在 htaccess 文件中定义 请参阅下面的代码 现在他正尝试迁移到运行 apache 和 php fastcgi 的服务器 但路由不再有效
  • 从 XML 到 XML 文档的 XSLT 转换

    我需要帮助才能获得正确的 XSL 转换 我希望按原样复制源 XML 并对目标 XML 文件进行所需的更新 现在我正在尝试两件事 第一是将源复制到目标 XML 第二是更新根元素的命名空间 URL 和版本属性 请找到下面的代码 让我知道出了什么
  • 如何在 Python 中使用 OpenCV 泛化轮廓手写字符?

    我尝试从图像中检测并裁剪手写字符 某些字符可以被识别并包含在矩形中 但对于其他字符 相同的参数不起作用 我怎样才能概括它 原始图像 https i stack imgur com nvCXT png import cv2 import nu
  • 如何将测试输出设置为控制台而不是 gradle 中的 html for specs2

    我使用 specs2 scala 进行单元测试并使用 gradle 进行构建 默认情况下 单元测试输出到 html 文件 我想让输出直接输出到标准输出 就像 sbt 一样 有谁知道魔法咒语吗 谢谢 翅膀 您可以使用 test makes t
  • 使用 mod_rewrite 在 PHP 中重写 URL

    Web 服务器是 Apache 我想重写 URL 这样用户就不会知道实际的目录 例如 原网址 http www example com en piecework piecework php piecework id 11 预期网址 http
  • 如何关闭使用 FB.ui() 打开的 facebook SDK 对话框?

    我成功显示了邀请好友对话框 代码如下所示 当用户单击 跳过 时 iframe 对话框会显示一个新页面 但是从现在起我找不到关闭 iframe dialog 的方法 FB ui 不返回任何对象 似乎没有 Javascript SDK 方法 并
  • 在 Linux 上,命令行程序 mktemp 是否不如 C 函数 mkstemp 安全?

    这两个操作都会创建一个空文件并返回文件名 但 mkstemp 使文件以独占模式打开并为您提供句柄 C 功能有安全优势吗 这是否意味着命令行版本存在安全漏洞 顺便说一句 有趣的是 Linux 上的 C api 中有几个相关函数 其中大多数在其
  • 在运行时从指向基类的指针获取对象的类型

    我正在使用一个类库 其中所有类都直接或间接派生自基类Base并有一个名字 该库提供了按名称搜索对象的功能 该功能将返回Base 有没有办法在不检查所有可能性的情况下找到返回对象的类型dynamic cast就像我在下面的例子中所做的那样 如
  • firebase unauth 与 google 不允许更改用户

    在 Google 项目或 Firebase 数据库中是否有一个设置用于指定 unauth 不应缓存用户凭据 我已经通过 Firebase Google 身份验证登录了我的应用程序 调用 unauth 不允许我使用其他帐户再次登录 此后尝试登
  • 在 django 中,我可以在检索查询集之前在序言中设置变量吗?

    我需要根据用户定义的步幅对数据点进行不同的分组 并且我希望最大限度地减少与 django 交互的代码中的原始 SQL 数量 问题 我可以在MySQL中创建带参数的视图吗 https stackoverflow com questions 2
  • 在Videoview中旋转实际的视频缓冲区

    我目前正在开发一个专门针对 android 的 GoogleTV 设备的应用程序 其中使用或强制应用程序的方向为横向以外的任何方向都未启用 并且根据我的设想 将来也不会启用 实际上该应用程序只是崩溃了试图跑步setRequestedOrie
  • 在使用递归模板表示的 n 元树中放置元素时,角度拖放不起作用

    我对有角度的材料拖放不熟悉 我的应用程序正在使用 n 叉树 并且由于我不知道它的先验形式 因此我被迫使用递归模板来表示它 在过去的几天里 我一直在尝试使用 Angular 材质拖放来重新排序兄弟姐妹 如果我删除根节点 一切都会正常工作 但我