You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular:如何基于条件使用Dragula服务实现拖放功能

解决Dragula条件拖放与排序后保存数据库的问题

1. 用TypeScript变量控制是否允许拖放

不用通过判断类名来控制,直接在moves回调里用组件的变量就行,但要注意用箭头函数——普通函数里的this指向不是组件实例,拿不到你的变量。

比如在组件里定义一个控制拖放的变量(比如isDragAllowed = false),然后修改createGroup的配置:

// 组件内定义控制拖放的变量
isDragAllowed: boolean = false;

// 初始化Dragula组
this.dragulaService.createGroup('chapters-list', {
  moves: (el, container, handle) => {
    // 直接返回控制变量,true允许拖放,false禁止
    return this.isDragAllowed;
    // 如果需要保留特定手柄的判断,还可以加条件:
    // return this.isDragAllowed && handle.classList.contains('drag-handle');
  }
});

2. 无需多个Dragula服务,合并逻辑

你完全不需要创建两个Dragula服务,同一个chapters-list组可以同时配置拖放条件和订阅拖放完成事件。把条件判断加到createGroup里,再保留out事件的订阅即可,完整代码如下:

// 组件内的控制变量
isDragAllowed: boolean = false;

// 初始化Dragula并配置拖放条件
this.dragulaService.createGroup('chapters-list', {
  moves: (el, container, handle) => {
    return this.isDragAllowed; // 用变量控制拖放权限
  }
});

// 订阅拖放完成事件,执行数据库保存逻辑
this.dragulaService.out('chapters-list').subscribe((value) => {
  this.updateSorting(); // 你的保存函数继续正常使用
});

这样就能同时实现:只有当isDragAllowed为true时才允许拖放,拖放完成后自动调用updateSorting保存到数据库,而且全程只用一个Dragula组服务,不会出现冲突。

内容的提问来源于stack exchange,提问作者Ash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:10:26