使用AngularJS(带或不带jQuery)拖放,如何操作?
我想做的正是,但这是在jQuery中,我想知道在AngularJS中是否有这样做的方法,或者是否有人已经用AngularJS做过,如果没有,它如何支持AngularJS,允许您自定义指令来解决这类问题使用AngularJS(带或不带jQuery)拖放,如何操作?,jquery,angularjs,Jquery,Angularjs,我想做的正是,但这是在jQuery中,我想知道在AngularJS中是否有这样做的方法,或者是否有人已经用AngularJS做过,如果没有,它如何支持AngularJS,允许您自定义指令来解决这类问题 我知道使用jQuery,但我想继续讨论AngularJS,它非常混乱,所以如果我的问题不够好,我很抱歉,但我所发现的是,这一点都没有帮助。我真的很感激你能给我的任何建议。以下是我是如何做到的,它有点复杂,因为我包括了添加事件处理程序(启动、拖动、停止)和容器元素的功能。这是一把用于演示的小提琴。下
我知道使用jQuery,但我想继续讨论AngularJS,它非常混乱,所以如果我的问题不够好,我很抱歉,但我所发现的是,这一点都没有帮助。我真的很感激你能给我的任何建议。以下是我是如何做到的,它有点复杂,因为我包括了添加事件处理程序(启动、拖动、停止)和容器元素的功能。这是一把用于演示的小提琴。下面是另一个使用jQuery和jQueryUI[JSFIDLE w/jQuery]的版本。希望能有帮助 你可以这样使用它
ng-draggable='dragOptions'
你的控制器在哪里
$scope.dragOptions = {
start: function(e) {
console.log("STARTING");
},
drag: function(e) {
console.log("DRAGGING");
},
stop: function(e) {
console.log("STOPPING");
},
container: 'container-id'
}
这是指令
.directive('ngDraggable', function($document) {
return {
restrict: 'A',
scope: {
dragOptions: '=ngDraggable'
},
link: function(scope, elem, attr) {
var startX, startY, x = 0, y = 0,
start, stop, drag, container;
var width = elem[0].offsetWidth,
height = elem[0].offsetHeight;
// Obtain drag options
if (scope.dragOptions) {
start = scope.dragOptions.start;
drag = scope.dragOptions.drag;
stop = scope.dragOptions.stop;
var id = scope.dragOptions.container;
container = document.getElementById(id).getBoundingClientRect();
}
// Bind mousedown event
elem.on('mousedown', function(e) {
e.preventDefault();
startX = e.clientX - elem[0].offsetLeft;
startY = e.clientY - elem[0].offsetTop;
$document.on('mousemove', mousemove);
$document.on('mouseup', mouseup);
if (start) start(e);
});
// Handle drag event
function mousemove(e) {
y = e.clientY - startY;
x = e.clientX - startX;
setPosition();
if (drag) drag(e);
}
// Unbind drag events
function mouseup(e) {
$document.unbind('mousemove', mousemove);
$document.unbind('mouseup', mouseup);
if (stop) stop(e);
}
// Move element, within container if provided
function setPosition() {
if (container) {
if (x < container.left) {
x = container.left;
} else if (x > container.right - width) {
x = container.right - width;
}
if (y < container.top) {
y = container.top;
} else if (y > container.bottom - height) {
y = container.bottom - height;
}
}
elem.css({
top: y + 'px',
left: x + 'px'
});
}
}
}
})
指令('ngDraggable',函数($document){
返回{
限制:“A”,
范围:{
dragOptions:'=NGDRAGABLE'
},
链接:功能(范围、要素、属性){
变量startX,startY,x=0,y=0,
启动、停止、拖动、容器;
变量宽度=元素[0]。偏移网络宽度,
高度=元素[0]。视线外;
//获取拖动选项
if(范围dragOptions){
开始=scope.dragOptions.start;
拖动=scope.dragOptions.drag;
停止=scope.dragOptions.stop;
var id=scope.dragOptions.container;
container=document.getElementById(id).getBoundingClientRect();
}
//绑定鼠标向下事件
元素on('mousedown',函数(e){
e、 预防默认值();
startX=e.clientX-elem[0].offsetLeft;
startY=e.clientY-elem[0]。offsetTop;
$document.on('mousemove',mousemove);
$document.on('mouseup',mouseup);
如果(启动)启动(e);
});
//句柄拖动事件
函数mousemove(e){
y=e.clientY-startY;
x=e.clientX-startX;
设置位置();
如果(拖动)拖动(e);
}
//解除绑定拖动事件
功能鼠标(e){
$document.unbind('mousemove',mousemove);
$document.unbind('mouseup',mouseup);
如果(停止)停止(e);
}
//在容器内移动元素(如果提供)
函数setPosition(){
if(集装箱){
if(x<容器左){
x=容器。左;
}else if(x>container.right-宽度){
x=容器。右-宽度;
}
如果(y<容器顶部){
y=容器顶部;
}否则,如果(y>容器底部-高度){
y=容器底部-高度;
}
}
元素css({
顶部:y+‘px’,
左:x+‘px’
});
}
}
}
})
很久以前,我就在jQueryUI Dragable/Dropable周围创建了一个包装器。可能对你有帮助 演示:
来源:使用AngularJS拖放的最佳示例。用简单的步骤设计 首先定义anguler应用程序(ng app)名称,定义两个指令和一个控制器,如下所述。还应用一些css,这将改善html的外观和感觉 只需运行代码片段并享受编码过程
var module=angular.module('my-app',[]);
module.directive('draggable',function(){
返回{
限制:“A”,
链接:函数(范围、元素、属性){
元素[0]。addEventListener('dragstart',scope.handleDragStart,false);
元素[0]。addEventListener('dragend',scope.handleDragEnd,false);
}
}
});
module.directive('droppable',function(){
返回{
限制:“A”,
链接:函数(范围、元素、属性){
元素[0]。addEventListener('drop',scope.handleDrop,false);
元素[0]。addEventListener('dragover',scope.handleDragOver,false);
}
}
});
功能主控制器($scope)
{
$scope.drag\u类型=[
{name:“Charan”},
{名称:“Vijay”},
{姓名:“Mahesh”},
{名称:“达南杰”},
];
$scope.items=[];
$scope.handleDragStart=函数(e){
this.style.opacity='0.4';
e、 dataTransfer.setData('text/plain',this.innerHTML);
};
$scope.handleDragEnd=函数(e){
this.style.opacity='1.0';
};
$scope.handleDrop=函数(e){
e、 预防默认值();
e、 停止传播();
var dataText=e.dataTransfer.getData('text/plain');
$scope.$apply(函数(){
$scope.items.push(数据文本);
});
log($scope.items);
};
$scope.handleDragOver=函数(e){
e、 preventDefault();//必要。允许我们删除。
e、 dataTransfer.dropEffect='move';//请参阅有关dataTransfer对象的部分。
返回false;
};
}
.container{
宽度:600px;
边框:1px实心#CCC;
盒影:0 1px 5px#CCC;
边界半径:5px;
字体系列:verdana;
保证金:25像素自动;
}
.货柜头{
背景#f1f1;
背景图像:-webkit线性渐变(顶部,#f1f1,#CCC);
背景图像:-ms线性梯度(顶部,#f1f1,#CCC);
背景图像:-莫兹线性梯度(顶部,#f1f1,#CCC);
背景图像:-o-线性梯度(顶部,#f1f1,#CCC);
盒影:0 1px 2px#888;
填充:10px;
}
.集装箱h1{
填充:0;
保证金:0;
字体大小:16px;
字体大小:正常;
文本阴影:0 1px 2px白色;
颜色:#888;
文本对齐:居中;
}
.货柜组{
填充:10px 30px;
字体大小:12px;
线高:175%;
颜色:#333;
}
把学生从这里拖走
{{drag_type.name}
让学生在这里下车
你拖进来了:
,
{{name}}