2016-09-29 127 views
6

我为我的项目实施了DRAG和DROP Angularjs,以便将DIV从一个位置移动到另一个位置,以便让用户能够对这些项目进行分类。我只需要满足就是我的简单要求:使用角度js点击另一个div后Div移动

Step 1: User click at division (1) 
Step 2: User click at division (2) 

过程将采取: 一旦用户在步骤(2),则Goose将移动到STEP (2)。如果用户再次点击GooseSTEP(2)那么它会回到STEP(1)

我该怎么做?

正如你可以看到我的预期输出:

enter image description here

我目前为止代码:

var myApp = angular.module('MyApp',['ngDraggable']).controller('MyCtrl',function($scope){ 
 
    
 
    $scope.centerAnchor = true; 
 
    $scope.toggleCenterAnchor = function() { 
 
     $scope.centerAnchor = !$scope.centerAnchor 
 
    }; 
 

 
    var onDraggableEvent = function (evt, data) { 
 
     console.log("128", "onDraggableEvent", evt, data); 
 
    }; 
 
    $scope.$on('draggable:start', onDraggableEvent); 
 
    $scope.$on('draggable:end', onDraggableEvent); 
 
    $scope.droppedObjects0 = [{name:'Goose'},{name:'Rabbit'},{name:'Chick'},{name:'Cat'}]; 
 
    $scope.droppedObjects1 = []; //Answer: Cat + Rabbit 
 
    $scope.droppedObjects2 = []; //Answer: Chicken + Goose 
 
    
 
    
 
    $scope.AnswerOject1 = [{name:'Arnab'},{name:'Kucing'}]; 
 
    $scope.AnswerOject2 = [{name:'Angsa'},{name:'Ayam'}]; 
 
    
 
    $scope.onDropComplete0 = function (data, evt) { 
 
     console.log("127", "$scope", "onDropComplete0", data, evt); 
 
     var index = $scope.droppedObjects0.indexOf(data); 
 
     if (index == -1) 
 
      $scope.droppedObjects0.push(data); 
 
    }; 
 
    $scope.onDropComplete1 = function (data, evt) { 
 
     console.log("127", "$scope", "onDropComplete1", data, evt); 
 
     var index = $scope.droppedObjects1.indexOf(data); 
 
     if (index == -1) 
 
      $scope.droppedObjects1.push(data); 
 
    }; 
 
    $scope.onDragSuccess0 = function (data, evt) { 
 
     console.log("133", "$scope", "onDragSuccess0", "", evt); 
 
     var index = $scope.droppedObjects0.indexOf(data); 
 
     if (index > -1) { 
 
      $scope.droppedObjects0.splice(index, 1); 
 
     } 
 
    }; 
 
    $scope.onDragSuccess1 = function (data, evt) { 
 
     console.log("133", "$scope", "onDragSuccess1", "", evt); 
 
     var index = $scope.droppedObjects1.indexOf(data); 
 
     if (index > -1) { 
 
      $scope.droppedObjects1.splice(index, 1); 
 
     } 
 
    }; 
 
    $scope.onDragSuccess2 = function (data, evt) { 
 
     var index = $scope.droppedObjects2.indexOf(data); 
 
     if (index > -1) { 
 
      $scope.droppedObjects2.splice(index, 1); 
 
     } 
 
    }; 
 
    $scope.onDropComplete2 = function (data, evt) { 
 
     var index = $scope.droppedObjects2.indexOf(data); 
 
     if (index == -1) { 
 
      $scope.droppedObjects2.push(data); 
 
     } 
 
    }; 
 
    var inArray = function (array, obj) { 
 
     var index = array.indexOf(obj); 
 
    }; 
 
});
.body 
 
{ 
 
    width:500px; 
 
    margin-left:auto; 
 
    margin-right:auto; 
 
} 
 

 
[ng-drag] { 
 
    -moz-user-select: -moz-none; 
 
    -khtml-user-select: none; 
 
    -webkit-user-select: none; 
 
    -ms-user-select: none; 
 
    user-select: none; 
 
} 
 

 
[ng-drag] { 
 
    width: 50px; 
 
    height: 50px; 
 
    background: rgba(255, 255, 255, 0.5); 
 
    color: #131313; 
 
    text-align: center; 
 
    padding-top: 12px; 
 
    display: inline-block; 
 
    margin: 5px 5px; 
 
    cursor: move; 
 
    border: 1px solid #ccc; 
 
    border-radius: 4px; 
 
} 
 

 
ul.draggable-objects:after { 
 
    display: block; 
 
    content: ""; 
 
    clear: both; 
 
} 
 

 
.draggable-objects li { 
 
    float: left; 
 
    display: block; 
 
    width: 50px; 
 
    height: 50px; 
 
    margin:2px; 
 
} 
 

 
[ng-drag].drag-over { 
 
    border: solid 1px red; 
 
} 
 

 
[ng-drag].dragging { 
 
    opacity: 0.5; 
 
} 
 

 
[ng-drop] { 
 
    background: rgba(198, 255, 198, 0.5); 
 
    text-align: center; 
 
    height: 150px; 
 
    padding-top: 10px; 
 
    display: block; 
 
    margin: 20px auto; 
 
    position: relative; 
 
    border: 1px solid #c3c3c3; 
 
    border-radius: 8px; 
 
} 
 

 
[ng-drop].drag-enter { 
 
    border: solid 5px red; 
 
} 
 

 
[ng-drop] span.title { 
 
    display: block; 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
    width: 200px; 
 
    height: 20px; 
 
    margin-left: -100px; 
 
    margin-top: -10px; 
 
} 
 

 
[ng-drop] div { 
 
    position: relative; 
 
    z-index: 2; 
 
} 
 
.list-of-drag-item 
 
{ 
 
    height: 83px; 
 
    background-color: #f7f7f7; 
 
}
<link href="http://code.ionicframework.com/1.3.1/css/ionic.min.css" rel="stylesheet"/> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/ngDraggable/0.1.10/ngDraggable.js"></script> 
 

 
<div ng-app="MyApp" ng-controller="MyCtrl" class="body"> 
 
Categorize the animals based on their reproductive system 
 
<div class="row"> 
 
    <div class="col"> 
 
     <div class="list-of-drag-item" ng-drop="true" ng-drop-success="onDropComplete0($data,$event)"> 
 
      <div ng-click="clickMe()" ng-repeat="obj in droppedObjects0" ng-drag="true" ng-drag-data="obj" 
 
       ng-drag-success="onDragSuccess0($data,$event)" ng-center-anchor="{{centerAnchor}}"> 
 
       {{obj.name}} 
 
      </div> 
 
     </div> 
 
    </div> 
 
</div> 
 
<div class="row" style="text-align: center;"> 
 
    <div class="col div-left"> 
 
     <span class="title">Animals that give birth 
 
     <div ng-drop="true" ng-drop-success="onDropComplete1($data,$event)"> 
 
      <div ng-repeat="obj in droppedObjects1" ng-drag="true" ng-drag-data="obj" 
 
       ng-drag-success="onDragSuccess1($data,$event)" ng-center-anchor="{{centerAnchor}}"> 
 
       {{obj.name}} 
 
      </div> 
 
     </div> 
 
    </div> 
 
    <div class="col div-right"> 
 
     <span class="title">Animals that Laying Eggs</span> 
 
     <div ng-drop="true" ng-drop-success="onDropComplete2($data,$event)"> 
 
      <div ng-repeat="obj in droppedObjects2" ng-drag="true" ng-drag-data="obj" 
 
       ng-drag-success="onDragSuccess2($data,$event)" ng-center-anchor="{{centerAnchor}}"> 
 
       {{obj.name}} 
 
      </div> 
 
     </div> 
 
    </div> 
 
</div> 
 
    </div>

+0

我很抱歉,但我没有得到你想要做什么。你可以试着更详细地解释一下吗? – thepio

+0

用户首先点击“Goose”,然后点击下面的DIV,Goose将移动到该DIV。 – Nere

+0

哦,好的!感谢您的澄清。 – thepio

回答

4

我改变你的代码来实现这一目标。首先,你没有检查你的drop事件处理程序是否有一个对象,如果你只是点击一个元素就会触发drop事件。必须是拖动库&中的错误。 然后,我添加了点击处理程序的元素,以保存$scope.activeElement中的给定参考及其在containerOfActiveElement中的容器参考。此外,容器上还有点击处理程序,用于从容器数组中添加和移除活动元素。

模板和css中还有一些代码用于在活动元素上设置红色背景。它还增加了一个过渡,与角色扮演者$timeout一起使动画发生。

你有很多重复的代码。你可以通过像我一样传递数组引用来改善它。

var myApp = angular.module('MyApp', ['ngDraggable']).controller('MyCtrl',function($scope, $timeout){ 
 

 
$scope.activeElement; 
 
var containerOfActiveElement; 
 
var activeHTMLElement; 
 
var getCenterOfELement = function (htmlElement) { 
 
    var rect = htmlElement.getBoundingClientRect(); 
 
    return { 
 
    x: rect.left + rect.width/2, 
 
    y: rect.top + rect.height/2 
 
    } 
 
}; 
 
$scope.onElementClick = function(event, data, container) { 
 
    if (!angular.equals(data, $scope.activeElement)) { 
 
    event.stopPropagation(); // you need this for not firing event on container 
 
    $scope.activeElement = data; 
 
    containerOfActiveElement = container; 
 
    activeHTMLElement = event.target; 
 
    } else 
 
    $scope.activeElement = null; 
 
}; 
 
$scope.onTargetClick = function(container, event) { 
 
    if ($scope.activeElement) { 
 
    var activeCenter = getCenterOfELement(activeHTMLElement); 
 
    var targetCenter = getCenterOfELement(event.target); 
 
    var offsetX = targetCenter.x - activeCenter.x; 
 
    var offsetY = targetCenter.y - activeCenter.y; 
 
    activeHTMLElement.style.transform= 'translate('+offsetX+'px,'+offsetY+'px)'; 
 
    $timeout(function() { 
 
     container.push($scope.activeElement); 
 
     var index = containerOfActiveElement.indexOf($scope.activeElement); 
 
     containerOfActiveElement.splice(index, 1); 
 
     $scope.activeElement = null; 
 
     containerOfActiveElement = null; 
 
     activeHTMLElement = null; 
 
    }, 200); 
 
    } 
 
}; 
 
    
 
$scope.centerAnchor = true; 
 
$scope.toggleCenterAnchor = function() { 
 
    $scope.centerAnchor = !$scope.centerAnchor 
 
}; 
 

 
/* can be removed, since it has no effect: 
 
var onDraggableEvent = function (evt, data) { 
 
    console.log("128", "onDraggableEvent", evt, data); 
 
}; 
 
$scope.$on('draggable:start', onDraggableEvent); 
 
$scope.$on('draggable:end', onDraggableEvent); 
 
*/ 
 
    
 
$scope.droppedObjects0 = [{name:'Goose'},{name:'Rabbit'},{name:'Chick'},{name:'Cat'}]; 
 
$scope.droppedObjects1 = []; //Answer: Cat + Rabbit 
 
$scope.droppedObjects2 = []; //Answer: Chicken + Goose 
 

 

 
$scope.AnswerOject1 = [{name:'Arnab'},{name:'Kucing'}]; 
 
$scope.AnswerOject2 = [{name:'Angsa'},{name:'Ayam'}]; 
 

 
$scope.onDropComplete0 = function (data, evt) { 
 
    console.log("127", "$scope", "onDropComplete0", data, evt); 
 
    var index = $scope.droppedObjects0.indexOf(data); 
 
    if (index == -1 && data !== null) // gave unwanted result if data was null (new empty object) 
 
     $scope.droppedObjects0.push(data); 
 
}; 
 
$scope.onDropComplete1 = function (data, evt) { 
 
    console.log("127", "$scope", "onDropComplete1", data, evt); 
 
    var index = $scope.droppedObjects0.indexOf(data); 
 
    if (index == -1 && data !== null) 
 
     $scope.droppedObjects1.push(data); 
 
}; 
 
$scope.onDragSuccess0 = function (data, evt) { 
 
    console.log("133", "$scope", "onDragSuccess0", "", evt); 
 
    var index = $scope.droppedObjects0.indexOf(data); 
 
    if (index > -1 && data) { 
 
     $scope.droppedObjects0.splice(index, 1); 
 
    } 
 
}; 
 
$scope.onDragSuccess1 = function (data, evt) { 
 
    console.log("133", "$scope", "onDragSuccess1", "", evt); 
 
    var index = $scope.droppedObjects1.indexOf(data); 
 
    if (index > -1) { 
 
     $scope.droppedObjects1.splice(index, 1); 
 
    } 
 
}; 
 
$scope.onDragSuccess2 = function (data, evt) { 
 
    var index = $scope.droppedObjects2.indexOf(data); 
 
    if (index > -1) { 
 
     $scope.droppedObjects2.splice(index, 1); 
 
    } 
 
}; 
 
$scope.onDropComplete2 = function (data, evt) { 
 
    var index = $scope.droppedObjects2.indexOf(data); 
 
    if (index == -1 && data !== null) { 
 
     $scope.droppedObjects2.push(data); 
 
    } 
 
}; 
 
var inArray = function (array, obj) { 
 
    var index = array.indexOf(obj); 
 
}; 
 
$scope.logResults = function() { 
 
    console.log({ 
 
     'div1': $scope.droppedObjects0, 
 
     'div2': $scope.droppedObjects1, 
 
     'div3': $scope.droppedObjects2 
 
    }); 
 
} 
 
});
.body 
 
{ 
 
    width:500px; 
 
    margin-left:auto; 
 
    margin-right:auto; 
 
} 
 

 
[ng-drag] { 
 
    -moz-user-select: -moz-none; 
 
    -khtml-user-select: none; 
 
    -webkit-user-select: none; 
 
    -ms-user-select: none; 
 
    user-select: none; 
 
} 
 

 
[ng-drag] { 
 
    width: 50px; 
 
    height: 50px; 
 
    background: rgba(255, 255, 255, 0.5); 
 
    color: #131313; 
 
    text-align: center; 
 
    padding-top: 12px; 
 
    display: inline-block; 
 
    margin: 5px 5px; 
 
    cursor: move; 
 
    border: 1px solid #ccc; 
 
    border-radius: 4px; 
 
} 
 

 
ul.draggable-objects:after { 
 
    display: block; 
 
    content: ""; 
 
    clear: both; 
 
} 
 

 
.draggable-objects li { 
 
    float: left; 
 
    display: block; 
 
    width: 50px; 
 
    height: 50px; 
 
    margin:2px; 
 
} 
 

 
[ng-drag].drag-over { 
 
    border: solid 1px red; 
 
} 
 

 
[ng-drag].dragging { 
 
    opacity: 0.5; 
 
} 
 

 
[ng-drop] { 
 
    background: rgba(198, 255, 198, 0.5); 
 
    text-align: center; 
 
    height: 150px; 
 
    padding-top: 10px; 
 
    display: block; 
 
    margin: 20px auto; 
 
    position: relative; 
 
    border: 1px solid #c3c3c3; 
 
    border-radius: 8px; 
 
} 
 

 
[ng-drop].drag-enter { 
 
    border: solid 5px red; 
 
} 
 

 
[ng-drop] span.title { 
 
    display: block; 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
    width: 200px; 
 
    height: 20px; 
 
    margin-left: -100px; 
 
    margin-top: -10px; 
 
} 
 

 
[ng-drop] div { 
 
    position: relative; 
 
    z-index: 2; 
 
} 
 
.list-of-drag-item 
 
{ 
 
    height: 83px; 
 
    background-color: #f7f7f7; 
 
} 
 

 
.active { 
 
    background-color: red; 
 
    color: white; 
 
    transition: transform .2s ease-in-out; 
 
}
<link href="http://code.ionicframework.com/1.3.1/css/ionic.min.css" rel="stylesheet"/> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/ngDraggable/0.1.10/ngDraggable.js"></script> 
 

 
<div ng-app="MyApp" ng-controller="MyCtrl" class="body"> 
 
    Categorize the animals based on their reproductive system 
 
<div class="row"> 
 
<div class="col"> 
 
    <div class="list-of-drag-item" ng-drop="true" ng-drop-success="onDropComplete0($data,$event)" ng-click="onTargetClick(droppedObjects0, $event)"> 
 
     <div ng-click="onElementClick($event, obj, droppedObjects0)" ng-repeat="obj in droppedObjects0" ng-drag="true" ng-drag-data="obj" 
 
      ng-drag-success="onDragSuccess0($data,$event)" ng-center-anchor="{{centerAnchor}}" ng-class="{active: activeElement.name === obj.name}"> 
 
      {{obj.name}} 
 
     </div> 
 
    </div> 
 
</div> 
 
</div> 
 
<div class="row" style="text-align: center;"> 
 
<div class="col div-left"> 
 
    <span class="title">Animals that give birth 
 
    <div ng-drop="true" ng-drop-success="onDropComplete1($data,$event)" ng-click="onTargetClick(droppedObjects1, $event)"> 
 
     <div ng-repeat="obj in droppedObjects1" ng-drag="true" ng-drag-data="obj" ng-drag-success="onDragSuccess1($data,$event)" ng-center-anchor="{{centerAnchor}}" ng-click="onElementClick($event, obj, droppedObjects1)" ng-class="{active: activeElement.name === obj.name}"> 
 
      {{obj.name}} 
 
     </div> 
 
    </div> 
 
</div> 
 
<div class="col div-right"> 
 
    <span class="title">Animals that Laying Eggs</span> 
 
    <div ng-drop="true" ng-drop-success="onDropComplete2($data,$event)" ng-click="onTargetClick(droppedObjects2, $event)"> 
 
     <div ng-repeat="obj in droppedObjects2" ng-drag="true" ng-drag-data="obj" 
 
      ng-drag-success="onDragSuccess2($data,$event)" ng-center-anchor="{{centerAnchor}}" ng-click="onElementClick($event, obj, droppedObjects2)" ng-class="{active: activeElement.name === obj.name}"> 
 
      {{obj.name}} 
 
     </div> 
 
    </div> 
 
</div> 
 
</div> 
 
    <button ng-click="logResults()">log results</button> 
 
</div>

+0

非常好!如果你可以在换箱位置做动画,那么它会非常出色!还有一个..你能告诉我以JSON类型返回的数据吗?例如[{DIV:1,[{“CHICK”,“GOOSE”}]] – Nere

+1

在这里,我添加了一个动画,还有一个按钮,州。 –

+0

我会给你5天的答案。你已经完全回答了我的问题。非常感谢你! – Nere