三步实现AriaNg任务自由排序:拖放API完全指南

三步实现AriaNg任务自由排序:拖放API完全指南

【免费下载链接】AriaNg AriaNg, a modern web frontend making aria2 easier to use. 【免费下载链接】AriaNg 项目地址: https://gitcode.com/gh_mirrors/ar/AriaNg

你还在为AriaNg默认任务列表无法自定义排序而烦恼吗?本文将通过拖放API实现任务自由排序功能,无需修改核心代码即可让下载管理更高效。读完本文你将获得:

  • 拖放排序的完整实现方案
  • 与AriaNg现有架构的无缝集成方法
  • 支持多场景的排序状态持久化技巧

核心原理与文件准备

AriaNg的任务列表管理主要通过src/scripts/controllers/list.js控制器实现,我们需要在此基础上添加拖放功能。核心实现将涉及三个关键文件:

mermaid

必要文件修改清单

第一步:实现拖放指令

在现有指令系统中添加拖拽功能,新建src/scripts/directives/dragSort.js文件:

angular.module('ariaNg.directives')
    .directive('dragSort', ['$timeout', function($timeout) {
        return {
            restrict: 'A',
            scope: {
                dragItems: '=',
                onSortUpdate: '&'
            },
            link: function(scope, element, attrs) {
                let draggedItem = null;
                
                element.find('tbody tr').attr('draggable', true);
                
                element.on('dragstart', 'tr', function(e) {
                    draggedItem = angular.element(this).scope().task;
                    this.classList.add('dragging');
                });
                
                element.on('dragover', 'tr', function(e) {
                    e.preventDefault();
                    const draggingElement = element.find('.dragging')[0];
                    const targetElement = this;
                    
                    if (draggingElement !== targetElement) {
                        const rect = targetElement.getBoundingClientRect();
                        const y = e.clientY - rect.top;
                        const isBelow = y > rect.height / 2;
                        
                        if (isBelow) {
                            targetElement.parentNode.insertBefore(draggingElement, targetElement.nextSibling);
                        } else {
                            targetElement.parentNode.insertBefore(draggingElement, targetElement);
                        }
                    }
                });
                
                element.on('dragend', function() {
                    element.find('.dragging').removeClass('dragging');
                    const newOrder = Array.from(element.find('tbody tr'))
                        .map(row => angular.element(row).scope().task.gid);
                    
                    scope.$apply(() => {
                        scope.onSortUpdate({newOrder: newOrder});
                    });
                });
            }
        };
    }]);

第二步:修改任务列表控制器

更新任务列表控制器src/scripts/controllers/list.js,添加排序逻辑:

// 在控制器中添加排序处理函数
$scope.updateTaskOrder = function(newOrder) {
    const orderedTasks = [];
    newOrder.forEach(gid => {
        const task = $scope.tasks.find(t => t.gid === gid);
        if (task) orderedTasks.push(task);
    });
    
    $scope.tasks = orderedTasks;
    ariaNgStorageService.set('customTaskOrder', newOrder); // 持久化排序
    
    // 更新任务显示
    $scope.$broadcast('taskOrderUpdated');
};

// 初始化时加载保存的排序
const savedOrder = ariaNgStorageService.get('customTaskOrder', []);
if (savedOrder.length > 0) {
    $scope.updateTaskOrder(savedOrder);
}

第三步:视图集成与样式优化

修改任务列表视图src/views/list.html,添加拖拽指令:

<table class="table table-hover table-striped" drag-sort drag-items="tasks" on-sort-update="updateTaskOrder(newOrder)">
    <!-- 现有表格内容保持不变 -->
</table>

添加拖拽视觉反馈样式到src/styles/controls/task-table.css

/* 拖拽中样式 */
tr.dragging {
    opacity: 0.5;
    background-color: #f5f5f5;
    border: 2px dashed #337ab7;
}

/* 拖拽目标样式 */
tr.dragover {
    background-color: #e9f7fe;
}

/* 调整光标样式 */
[draggable="true"] {
    cursor: move;
}

功能扩展与兼容性处理

为确保拖放功能在所有支持AriaNg的环境中正常工作,需要添加触摸设备支持和异常处理:

// 在dragSort指令中添加触摸支持
let touchStartY = 0;
let touchStartIndex = -1;

element.on('touchstart', 'tr', function(e) {
    touchStartY = e.touches[0].clientY;
    touchStartIndex = Array.from(element.find('tbody tr')).indexOf(this);
    draggedItem = angular.element(this).scope().task;
    this.classList.add('dragging');
});

// 触摸移动处理逻辑
// ...(省略触摸事件处理代码)

实现效果与使用建议

完成上述修改后,任务列表将支持拖拽排序,排序状态会通过src/scripts/services/ariaNgStorageService.js持久化保存。建议配合任务筛选功能使用,可实现不同分类下的独立排序。

mermaid

通过本文介绍的拖放API集成方法,不仅实现了任务自定义排序,更保持了与AriaNg现有架构的兼容性。所有修改都基于扩展而非侵入式修改,可安全应用于最新版本的AriaNg。完整实现代码可参考src/scripts/directives/目录下的拖拽相关文件。

【免费下载链接】AriaNg AriaNg, a modern web frontend making aria2 easier to use. 【免费下载链接】AriaNg 项目地址: https://gitcode.com/gh_mirrors/ar/AriaNg

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值