AngularJS – 可拖动和多个连接的可排序(jQuery UI angular-comm
发布时间:2020-12-17 17:13:51 所属栏目:安全 来源:网络整理
导读:我正在尝试扩展 angular-common的优秀 dragdrop module,它可以处理可拖动连接到单个可排序的. (angular-common的dragdrop模块后面的原始SO线程是 here.) 我设法连接两个sortables,并为每个sortables删除一个draggable,并在sortables内重新排列工作正常(范围
我正在尝试扩展
angular-common的优秀
dragdrop module,它可以处理可拖动连接到单个可排序的. (angular-common的dragdrop模块后面的原始SO线程是
here.)
我设法连接两个sortables,并为每个sortables删除一个draggable,并在sortables内重新排列工作正常(范围项数组按预期更新).实际上UI部分工作正常,但是当我将列表项从一个可排序项拖到另一个时,我似乎无法弄清楚如何更新Angular作用域中的项数组. 厂: .factory('DragDropHandler',[function() { return { dragObject: undefined,addObject: function(object,objects,to) { objects.splice(to,object); },moveObject: function(objects,from,objects.splice(from,1)[0]); } }; }]) Droppable(可排序)指令: .directive('droppable',['DragDropHandler',function(DragDropHandler) { return { scope: { droppable: '=',ngUpdate: '&',ngCreate: '&' },link: function(scope,element,attrs){ element.sortable({ connectWith: ['.draggable','.sortable'],}); element.disableSelection(); var list = element.attr('id'); element.on("sortdeactivate",function(event,ui) { var from = angular.element(ui.item).scope().$index; var to = element.children().index(ui.item); //console.log('from: ' + from + ',to: ' +to); if (to >= 0 ){ scope.$apply(function(){ if (from >= 0) { DragDropHandler.moveObject(scope.droppable,to,list); scope.ngUpdate({ from: from,to: to,list: list }); } else { scope.ngCreate({ object: DragDropHandler.dragObject,list: list }); ui.item.remove(); } }); } }); element.on("sortremove",ui) { //console.log(element); //console.log('a sort item is removed from a connected list and is dragged into another.'); }); element.on("sortreceive",ui) { //console.log(element); //console.log('item from a connected sortable list has been dropped.'); }); } }; }]); 控制器功能: $scope.updateObjects = function(from,list) { var itemIds = _.pluck($scope.items[list],'id'); //console.log(itemIds); }; $scope.createObject = function(object,list) { console.log(list); console.log($scope.items[list]); var newItem = angular.copy(object); newItem.id = Math.ceil(Math.random() * 1000); DragDropHandler.addObject(newItem,$scope.items[list],to); }; $scope.deleteItem = function(itemId) { $scope.items = _.reject($scope.items,function(item) { return item.id == itemId; }); }; 并且观点: <h3>sortable</h3> <ul droppable='items.list1' ng-update='updateObjects(from,to)' ng-create='createObject(object,list)' id="list1" class="sortable"> <li class="ui-state-default" ng-repeat="item in items.list1 track by item.id"> {{ $index }}: {{ item.id }} - {{ item.name }} <button ng-click='deleteItem(item.id)' class='btn btn-xs pull-right btn-danger'>X</button> </li> </ul> <h3>sortable</h3> <ul droppable='items.list2' ng-update='updateObjects(from,list)' id="list2" class="sortable"> <li class="ui-state-default" ng-repeat="item in items.list2 track by item.id"> {{ $index }}: {{ item.id }} - {{ item.name }} <button ng-click='deleteItem(item.id)' class='btn btn-xs pull-right btn-danger'>X</button> </li> </ul> Working example on Plunker. 任何帮助将不胜感激. 解决方法
好的,我终于解决了.我创建了一个
fork on GitHub和
PLUNKER UPDATED!
说明:关键是检查是否为另一个可排序列表设置了拖动对象的ui.sender.如果已设置,则该对象来自另一个可排序的,否则不是. 扩展的droppable(可排序)指令: .directive('droppable',ngMove: '&',}); element.disableSelection(); var list = element.attr('id'); element.on("sortupdate",ui) { var from = angular.element(ui.item).scope().$index; var to = element.children().index(ui.item); if (to >= 0 ){ //item is moved to this list scope.$apply(function(){ if (from >= 0) { //item is coming from a sortable if (!ui.sender) { //item is coming from this sortable DragDropHandler.moveObject(scope.droppable,to); } else { //item is coming from another sortable scope.ngMove({ from: from,fromList: ui.sender.attr('id'),toList: list }); ui.item.remove(); } } else { //item is coming from a draggable scope.ngCreate({ object: DragDropHandler.dragObject,list: list }); ui.item.remove(); } }); } }); } }; }]); 在控制器中我添加了一个moveObject函数,它负责将对象从旧数组移动到新数组: $scope.moveObject = function(from,fromList,toList) { var item = $scope.items[fromList][from]; DragDropHandler.addObject(item,$scope.items[toList],to); $scope.items[fromList].splice(0,1); } 并且必须更新deleteItem函数以处理多个sortables的多个数组(只是为了让demo完全运行): $scope.deleteItem = function(itemId) { for (var list in $scope.items) { if ($scope.items.hasOwnProperty(list)) { $scope.items[list] = _.reject($scope.items[list],function(item) { return item.id == itemId; }); } } }; 并且观点: <h3>sortable</h3> <ul droppable='items.list2' ng-move='moveObject(from,toList)' ng-create='createObject(object,list)' id="list2" class="sortable"> <li class="ui-state-default" ng-repeat="item in items.list2 track by item.id"> {{ $index }}: {{ item.id }} - {{ item.name }} <button ng-click='deleteItem(item.id)' class='btn btn-xs pull-right btn-danger'>X</button> </li> </ul> 我删除了ngUpdate,据我所知,它没有任何实际功能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |