Angular directive D&D
Faire du Drag&Drop avec angular pour frangular
by manland
HTML
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script>
<div ng-app="app" ng-controller="ColumnController">
<div ng-repeat="c in columns" class="column"
drag="c" dragStyle="columnDrag"
drop="c" dropStyle="columnDrop">
{{c.title}}
</div>
</div>
CSS
.column {
width: 50px;
height: 50px;
background-color: red;
text-align: center;
border: 1px solid black;
display:inline-block;
margin: 50px;
}
.columnDrag {
opacity: 0.7;
background-color: blue;
}
.columnDrop {
background-color: green;
}
JavaScript
var app = angular.module('app', []);
app.directive("drag", ["$rootScope", function($rootScope) {
function dragStart(evt, element, dragStyle) {
element.addClass(dragStyle);
evt.dataTransfer.setData("id", evt.target.id);
evt.dataTransfer.effectAllowed = 'move';
};
function dragEnd(evt, element, dragStyle) {
element.removeClass(dragStyle);
};
return {
restrict: 'A',
link: function(scope, element, attrs) {
attrs.$set('draggable', 'true');
scope.dragData = scope[attrs["drag"]];
scope.dragStyle = attrs["dragstyle"];
element.bind('dragstart', function(evt) {
$rootScope.draggedElement = scope.dragData;
dragStart(evt, element, scope.dragStyle);
});
element.bind('dragend', function(evt) {
dragEnd(evt, element, scope.dragStyle);
});
}
}
}]);
app.directive("drop", ['$rootScope', function($rootScope) {
function dragEnter(evt, element, dropStyle) {
evt.preventDefault();
element.addClass(dropStyle);
};
function dragLeave(evt, element, dropStyle) {
element.removeClass(dropStyle);
};
function dragOver(evt) {
evt.preventDefault();
};
function drop(evt, element, dropStyle) {
evt.preventDefault();
element.removeClass(dropStyle);
};
return {
restrict: 'A',
link: function(scope, element, attrs) {
scope.dropData = scope[attrs["drop"]];
scope.dropStyle = attrs["dropstyle"];
element.bind('dragenter', function(evt) {
dragEnter(evt, element, scope.dropStyle);
});
element.bind('dragleave', function(evt) {
dragLeave(evt, element, scope.dropStyle);
});
element.bind('dragover', dragOver);
element.bind('drop', function(evt) {
drop(evt, element, scope.dropStyle);
$rootScope.$broadcast('dropEvent', $rootScope.draggedElement, scope.dropData);
});
}
}
}]);
app.controller('ColumnController', ["$scope", "$rootScope", function($scope,...