Drag and drop w AngularJS cz. 2

Tym razem rozbudujemy nasz poprzedni przykład drag nad drop. Dodamy nowy typ - kontener na inne pola. Końcowy efekt będzie wyglądał następująco.

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width; initial-scale=1.0">
  6. <title>AngularJS Drag and drop example 2</title>
  7. <link rel="stylesheet" href="css/bootstrap.min.css">
  8. <link rel="stylesheet" href="css/bootstrap-theme.min.css">
  9. <link rel="stylesheet" href="css/demo-framework.css">
  10. <link rel="stylesheet" type="text/css" href="css/simple.css?a">
  11. <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  12. <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"></script>
  13. <script src="js/angular-drag-and-drop-lists.js"></script>
  14. <script type="text/javascript" src="js/list2.js?a"></script>
  15. </head>
  16. <body ng-app="demo" ng-controller="SimpleDemoController">
  17. <h1>AngularJS Drag and drop</h1>
  18. <div class="simpleDemo row">
  19. <div class="col-md-8">
  20. <div class="row">
  21. <div class="col-md-6">
  22. <div class="panel panel-info">
  23. <div class="panel-heading">
  24. <h3 class="panel-title">List A</h3>
  25. </div>
  26. <div class="panel-body">
  27. <ul class="typeA" dnd-list="models.lists.A" dnd-disable-if="true">
  28. <li ng-repeat="item in models.lists.A"
  29. data-type="{{item.type}}"
  30. dnd-draggable="item"
  31. dnd-type="'{{item.type}}'"
  32. dnd-moved="models.lists.A.splice($index, 1)"
  33. dnd-effect-allowed="copy"
  34. dnd-selected="models.selected = item"
  35. ng-class="{'selected': models.selected === item}"
  36. >
  37. {{item.label}}
  38. </li>
  39. </ul>
  40. </div>
  41. </div>
  42. </div>
  43. <div class="col-md-6">
  44. <div class="panel panel-info">
  45. <div class="panel-heading">
  46. <h3 class="panel-title">List B</h3>
  47. </div>
  48. <div class="panel-body">
  49. <ul class="typeB" dnd-list="models.lists.B">
  50. <li ng-repeat="item in models.lists.B"
  51. data-type="{{item.type}}"
  52. dnd-draggable="item"
  53. dnd-type="'{{item.type}}'"
  54. dnd-moved="models.lists.B.splice($index, 1)"
  55. dnd-effect-allowed="move"
  56. dnd-selected="models.selected = item"
  57. ng-class="{'selected': models.selected === item}"
  58. >
  59. <div ng-if="item.type === 'container'" class="panel-heading"><h3 class="panel-title">
  60. {{item.label}}
  61. </h3></div>
  62. {{item.label}} <span ng-if="item.type === 'container'">content</span>
  63. <div class="column" ng-if="item.type === 'container'">
  64. <ul dnd-list="item.columns" dnd-allowed-types="allowedTypes">
  65. <li ng-repeat="el in item.columns"
  66. dnd-draggable="el"
  67. dnd-type="'{{el.type}}'"
  68. dnd-effect-allowed="move"
  69. dnd-moved="item.columns.splice($index, 1)"
  70. dnd-selected="models.selected = item"
  71. ng-class="{selected: models.selected === item}"
  72. >{{el.label}}
  73. </li>
  74. </ul>
  75. </div>
  76. <div class="clearfix"></div>
  77. </li>
  78. </ul>
  79. </div>
  80. </div>
  81. </div>
  82. </div>
  83. </div>
  84. <div class="col-md-4">
  85. <div class="panel panel-default">
  86. <div class="panel-heading">
  87. <h3 class="panel-title">Generated Model</h3>
  88. </div>
  89. <div class="panel-body">
  90. <pre class="code">{{modelAsJson}}</pre>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. </body>
  96. </html>
Kod html jest prawie taki sam jak w poprzednim przykładzie. Doszedł jedynie następujący kod dotyczący wyświetlenia elementów typu kontener i ich elementów podrzędnych.
  1. <div ng-if="item.type === 'container'" class="panel-heading"><h3 class="panel-title">
  2. {{item.label}}
  3. </h3></div>
  4. {{item.label}} <span ng-if="item.type === 'container'">content</span>
  5. <div class="column" ng-if="item.type === 'container'">
  6. <ul dnd-list="item.columns" dnd-allowed-types="allowedTypes">
  7. <li ng-repeat="el in item.columns"
  8. dnd-draggable="el"
  9. dnd-type="'{{el.type}}'"
  10. dnd-effect-allowed="move"
  11. dnd-moved="item.columns.splice($index, 1)"
  12. dnd-selected="models.selected = item"
  13. ng-class="{selected: models.selected === item}"
  14. >{{el.label}}
  15. </li>
  16. </ul>
  17. </div>
  18. <div class="clearfix"></div>
Kod javascript również jest bardzo podobny do poprzedniego przykładu. Budujemy jedynie typ kontener (type="container"), który zawiera dodatkowy atrybut columns na elementy podrzędne.
  1. angular.module("demo", ["dndLists"]).controller("SimpleDemoController", function($scope) {
  2.  
  3. $scope.models = {
  4. selected: null,
  5. lists: {"A": [], "B": []}
  6. };
  7. $scope.allowedTypes = ['item'];
  8. // Generate initial model
  9. for (var i = 1; i <= 3; ++i) {
  10. $scope.models.lists.A.push({id: i, label: "Item A" + i, type: "item"});
  11. $scope.models.lists.B.push({id: i,label: "Item B" + i, type: "item"});
  12. }
  13. $scope.models.lists.A[2].type="container";
  14. $scope.models.lists.A[2].columns=[];
  15. $scope.models.lists.B[0].id=4;
  16. $scope.models.lists.B[1].id=5;
  17. $scope.models.lists.B[2].id=6;
  18. $scope.models.lists.B[1].type="container";
  19. $scope.models.lists.B[1].columns=[{
  20. "id": 50,
  21. "label": "Item B21",
  22. "type": "item"
  23. },
  24. {
  25. "id": 51,
  26. "label": "Item B22",
  27. "type": "item"
  28. }];
  29. // Model to JSON for demo purpose
  30. $scope.$watch('models', function(model) {
  31. $scope.modelAsJson = angular.toJson(model, true);
  32. }, true);
  33. });
Demo działania

Strona korzysta z plików cookies

Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Plików Cookies. Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.
OK
Więcej
Free cookie consent by cookie-script.com