使用 Angular 7 Material CDK 进行嵌套拖放

2023-12-13

我有一个拖放列表的嵌套树(不是树组件)。

当拖动另一个下拉列表中包含的下拉列表中的项目时 - 两个下拉列表都会触发 Enter / Exit 事件,这意味着当一个项目被删除时,它可以被放入内部下拉列表或容器下拉列表中,具体取决于它被删除的地方(注意:这些列表都是相互链接的)

我目前在想,如果拖动当前位于内部列表上方,最好的解决方案将是抑制容器列表触发的事件,但我不确定这是否是最佳解决方案,或者确切地说如何在片刻。


我确实设法找到了一个解决方案,尽管它绝对是 hacky 并且涉及使用 Angular 拖放 CDK 访问私有值。

我使用 cdkDropListEnterPredicate 函数来检查它应该尝试放入哪个列表,我分配了 canDropPredicate 函数。

我还被迫通过以下方式访问指针位置: _pointerPositionAtLastDirectionChange 这不是很好,因为并非所有我希望看到传递到 cdkDropListEnterPredicate 的值都被传递。

canDropPredicate(): Function {
    const me = this;
    return (drag: CdkDrag<ResourceNode>, drop: CdkDropList<ResourceNode>): boolean => {
        const fromBounds = drag.dropContainer.element.nativeElement.getBoundingClientRect();
        const toBounds = drop.element.nativeElement.getBoundingClientRect();

        if (!me.intersect(fromBounds, toBounds)) {
            return true;
        }

        // This gross but allows us to access a private field for now.
        const pointerPosition: Point = drag['_dragRef']['_pointerPositionAtLastDirectionChange'];
        // They Intersect with each other so we need to do some calculations here.
        if (me.insideOf(fromBounds, toBounds)) {
          return !me.pointInsideOf(pointerPosition, fromBounds);
        }

        if (me.insideOf(toBounds, fromBounds) && me.pointInsideOf(pointerPosition, toBounds)) {
          return true;
        }
         return false;
    };
}

intersect(r1: DOMRect | ClientRect, r2: DOMRect | ClientRect): boolean {
    return !(r2.left > r1.right ||
        r2.right < r1.left ||
        r2.top > r1.bottom ||
        r2.bottom < r1.top);
}

insideOf(innerRect: DOMRect | ClientRect, outerRect: DOMRect | ClientRect): boolean {
    return innerRect.left >= outerRect.left &&
        innerRect.right <= outerRect.right &&
        innerRect.top >= outerRect.top &&
        innerRect.bottom <= outerRect.bottom &&
        !(
            innerRect.left === outerRect.left &&
            innerRect.right === outerRect.right &&
            innerRect.top === outerRect.top &&
            innerRect.bottom === outerRect.bottom
        );
}

pointInsideOf(position: Point, rect: DOMRect | ClientRect) {
  return position.x >= rect.left &&
        position.x <= rect.right &&
        position.y >= rect.top &&
        position.y <= rect.bottom;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Angular 7 Material CDK 进行嵌套拖放 的相关文章

随机推荐

  • RouteData.Values 保持为空

    我的路线代码如下所示 RouteTable Routes MapPageRoute IDP Person IDP Person aspx 现在我想获取表单上的数据 通常它的工作原理如下 int id Convert ToInt32 Page
  • SQLException:字符串或二进制数据将被截断

    我有一个 C 代码 可以批量执行大量插入语句 在执行这些语句时 我收到 字符串或二进制数据将被截断 错误和事务回滚 为了找出是哪个插入语句导致了这个问题 我需要在 SQLServer 中一项一项地插入 直到遇到错误 是否有聪明的方法可以使用
  • NSNotificationCenter 与委托(使用协议)?

    它们各自的优点和缺点是什么 我应该在哪里具体使用它们 这里的经验法则是有多少客户希望收到事件通知 如果它主要是一个对象 例如 关闭视图或对单击的按钮进行操作 或对失败的下载做出反应 那么您应该使用委托模型 如果您发出的事件可能同时引起许多对
  • 如何从应用程序调用关闭电源、重新启动对话框?

    当从我的应用程序中长按电源按钮时 我想调用关闭电源 重新启动等对话框 与默认的 Android 对话框相同 我不需要从我的应用程序中直接调用重新启动 关闭电源等 只是想调用该对话框 怎么称呼呢 或如何在应用程序上发送电源按钮键 提前致谢 如
  • Nuxt.js - 是否可以将自定义路径/基设置为静态文件的网址?

    TLDR 如何更改静态文件路径src nuxt
  • 从 .idea 文件夹中忽略什么?

    可能的重复 Intellij Idea 9 10 要签入 或不签入 源代码管理的哪些文件夹 我开始使用 WebStorm 进行 Web 开发 但不确定要添加什么以及要从我们的 Git 存储库中排除什么 显然里面有一些文件 idea文件夹旨在
  • 更改 DataGridViewRow 的轮廓

    如果满足某个条件我想改变轮廓DataGridViewRow蓝色使其脱颖而出 我知道这不是BackColor因为它改变了行的背景颜色 我尝试过改变ForeColor为蓝色但没有任何变化 我不相信这是选择风格 因为这种行为不是我想要的 有什么建
  • WPF:如何使 DataGrid 与动态列的绑定可编辑?

    我需要将一些数据绑定到具有可变列数的 DataGrid 我使用以下代码使其工作 int n 0 foreach string title in TitleList DataGridTextColumn col new DataGridTex
  • 在 Android 上将 HTML 转换为图像(任何格式)[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 有谁知道如何在Android上将html代码 其中包含图像 转换为图像 我知道如何使用 JLabel JEditorPane 和 BufferedImage 在 Java 上实现它 但
  • 具有不可移动、默认可构造值类型的 map/unordered_map

    Update 出现在23 5 4 3中here那m 1 版本应该有效 Update2 m 1 正在使用 gcc4 9 1 具体来说 std mutex 假设我想要一个std unordered map
  • Javascript InnerHTML 删除表单元素中的数据

    我有一个带有按钮的表单 允许您向表单添加字段
  • 如何正确取消初始化 OpenSSL

    在我的 OpenSSL 客户端中 我遇到的问题是 当我选择静态链接 libeay32 和 ssleay32 而不是动态链接时 我从 Visual Leak Detector 收到了大量内存泄漏错误 我从 OP 中复制了命令这个线程 但我还剩
  • R 中多个数据帧的相同功能

    我是 R 新手 这是一个非常简单的问题 我发现了很多与我想要的类似的东西 但并不完全一样 基本上我有多个数据框 我只想在所有数据框上运行相同的函数 for 循环可以工作 但我不确定如何正确设置它来调用数据帧 它似乎也最喜欢使用 R 的 la
  • php exec() 命令权限被拒绝

    我有一个 C 可执行文件 skypeforwarder 如果我在 Mac 的终端中使用命令行 skypeforwarder 就可以工作 亨利 Users henry Desktop skypeForwarder skypekit sdk s
  • 如何按照请求的顺序处理 jquery ajax 请求

    我正在制作一个 java servlet 页面 用于检查域名列表 并通过 jquery ajax 请求检查每个名称 除了结果被乱序附加到 DOM 之外 它工作得很好 什么是按请求顺序处理请求但又像长轮询效果一样异步的最佳方法 我是 Java
  • 在启动时通过UAC授予c++程序管理权限

    所以我做了一些研究 但我有兴趣了解如何让他的程序在执行之前向 UAC 请求管理权限 这是否需要在 ShellExecute 中使用 runas 我意识到这是我在编程冒险中需要理解的事情 因为几乎我安装的每个程序都问过我这个问题 例如 如果我
  • 如何将整数转换为日期对象Python?

    我正在 python 中创建一个模块 在其中我收到整数格式的日期 例如20120213 表示 2012 年 2 月 13 日 现在 我想将这个整数格式的日期转换为 python 日期对象 另外 是否有任何方法可以减去 添加此类整数格式日期中
  • Android R 中的后台服务在省电模式下停止

    我编写了一个 Android 应用程序 通过更改电量来检查电池电量 并在电量达到特定值时发出警报 我在我的应用程序中使用了广播接收器和后台服务 它在所有 Android 版本中都能正常工作 但在 Android R 中 当打开省电模式时 服
  • 是否可以重命名 Firebase 实时数据库中的密钥?

    我想知道有没有办法更新键值 让我们使用以下数据 我正在使用 set 来写入数据 现在 我希望用户编辑他们的bookTitle两个地方都需要改变 我尝试使用 update 但似乎无法使其工作 我只能编辑bookTitle in bookInf
  • 使用 Angular 7 Material CDK 进行嵌套拖放

    我有一个拖放列表的嵌套树 不是树组件 当拖动另一个下拉列表中包含的下拉列表中的项目时 两个下拉列表都会触发 Enter Exit 事件 这意味着当一个项目被删除时 它可以被放入内部下拉列表或容器下拉列表中 具体取决于它被删除的地方 注意 这