How to Create simple drag and Drop in angularjs

后端 未结 8 1462
孤独总比滥情好
孤独总比滥情好 2020-11-29 16:55

I want to know how to do drag and drop by using AngularJs.

This is what I have so far:



        
相关标签:
8条回答
  • 2020-11-29 17:31

    I just posted this to my brand spanking new blog: http://jasonturim.wordpress.com/2013/09/01/angularjs-drag-and-drop/

    Code here: https://github.com/logicbomb/lvlDragDrop

    Demo here: http://logicbomb.github.io/ng-directives/drag-drop.html

    Here are the directives these rely on a UUID service which I've included below:

    var module = angular.module("lvl.directives.dragdrop", ['lvl.services']);
    
    module.directive('lvlDraggable', ['$rootScope', 'uuid', function($rootScope, uuid) {
            return {
                restrict: 'A',
                link: function(scope, el, attrs, controller) {
                    console.log("linking draggable element");
    
                    angular.element(el).attr("draggable", "true");
                    var id = attrs.id;
                    if (!attrs.id) {
                        id = uuid.new()
                        angular.element(el).attr("id", id);
                    }
    
                    el.bind("dragstart", function(e) {
                        e.dataTransfer.setData('text', id);
    
                        $rootScope.$emit("LVL-DRAG-START");
                    });
    
                    el.bind("dragend", function(e) {
                        $rootScope.$emit("LVL-DRAG-END");
                    });
                }
            }
        }]);
    
    module.directive('lvlDropTarget', ['$rootScope', 'uuid', function($rootScope, uuid) {
            return {
                restrict: 'A',
                scope: {
                    onDrop: '&'
                },
                link: function(scope, el, attrs, controller) {
                    var id = attrs.id;
                    if (!attrs.id) {
                        id = uuid.new()
                        angular.element(el).attr("id", id);
                    }
    
                    el.bind("dragover", function(e) {
                      if (e.preventDefault) {
                        e.preventDefault(); // Necessary. Allows us to drop.
                      }
    
                      e.dataTransfer.dropEffect = 'move';  // See the section on the DataTransfer object.
                      return false;
                    });
    
                    el.bind("dragenter", function(e) {
                      // this / e.target is the current hover target.
                      angular.element(e.target).addClass('lvl-over');
                    });
    
                    el.bind("dragleave", function(e) {
                      angular.element(e.target).removeClass('lvl-over');  // this / e.target is previous target element.
                    });
    
                    el.bind("drop", function(e) {
                      if (e.preventDefault) {
                        e.preventDefault(); // Necessary. Allows us to drop.
                      }
    
                      if (e.stopPropagation) {
                        e.stopPropagation(); // Necessary. Allows us to drop.
                      }
                        var data = e.dataTransfer.getData("text");
                        var dest = document.getElementById(id);
                        var src = document.getElementById(data);
    
                        scope.onDrop({dragEl: src, dropEl: dest});
                    });
    
                    $rootScope.$on("LVL-DRAG-START", function() {
                        var el = document.getElementById(id);
                        angular.element(el).addClass("lvl-target");
                    });
    
                    $rootScope.$on("LVL-DRAG-END", function() {
                        var el = document.getElementById(id);
                        angular.element(el).removeClass("lvl-target");
                        angular.element(el).removeClass("lvl-over");
                    });
                }
            }
        }]);
    

    UUID service

    angular
    .module('lvl.services',[])
    .factory('uuid', function() {
        var svc = {
            new: function() {
                function _p8(s) {
                    var p = (Math.random().toString(16)+"000000000").substr(2,8);
                    return s ? "-" + p.substr(0,4) + "-" + p.substr(4,4) : p ;
                }
                return _p8() + _p8(true) + _p8(true) + _p8();
            },
    
            empty: function() {
              return '00000000-0000-0000-0000-000000000000';
            }
        };
    
        return svc;
    });
    
    0 讨论(0)
  • 2020-11-29 17:31

    I'm a bit late to the party, but I have my own directive that looks like it'll fit your case (You can adapt it yourself). It's a modification of the ng-repeat directive that's specifically built for list re-ordering via DnD. I built it as I don't like JQuery UI (preference for less libraries than anything else) also I wanted mine to work on touch screens too ;).

    Code is here: http://codepen.io/SimeonC/pen/AJIyC

    Blog post is here: http://sdevgame.wordpress.com/2013/08/27/angularjs-drag-n-drop-re-order-in-ngrepeat/

    0 讨论(0)
提交回复
热议问题