加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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,据我所知,它没有任何实际功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读