2016-09-29 66 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