Не удается заставить RubaXa/angular-legacy-sortablejs перемещать элементы между списками

Может кто-нибудь сказать мне, почему эта планка не позволит мне перемещать элементы между двумя списками?

Я могу заставить общие списки работать, используя простую библиотеку RubaXa Sortable и простой Javascript, но мне не удалось заставить их работать с библиотекой Angular и RubaXa/angular-legacy-sortablejs.

Я прочитал и перечитал документы по параметрам конфигурации здесь и клянусь, что делаю это правильно.

Я также просмотрел пример из документов (не разрешено ссылаться на него из-за низкого количества повторений) без успеха.

Я создал два списка и соединил их, используя одинаковую информацию о конфигурации:

var ctrl = this;
ctrl.sortableConf = {
    group: {
        name: 'tags',
        pull: true,
        put: true
    },
    sort: true,
    animation: 150,
    draggable: '.list-group-item',
    filter: '.js-remove',
    chosenClass: ".sortable-chosen" 
}; 

Они оба прекрасно сортируются внутри, я просто не могу перетащить элемент из одного в другой или наоборот.


person sawk poopette    schedule 16.09.2016    source источник
comment
Я рискую, но полагаю, это потому, что списки используют 2 совершенно разных контроллера.   -  person Robin Jonsson    schedule 20.09.2016
comment
Это хорошее предположение, но нет. Им нужны отдельные контроллеры, но они должны быть объединены элементом group в конфигурации. Я думаю, что проблема именно в этом, но я не могу понять, в чем дело.   -  person sawk poopette    schedule 21.09.2016


Ответы (1)


Документация неверна, или я не знаю, как правильно ссылаться на нее, если нет использование частичной страницы вместо встроенного шаблона.

После отладки кода загрузки параметров в sortable.js я понял, что он не загружал блок group: из блока ctrl.sortableConf, и я застрял со значениями по умолчанию:

группировать объект при отладке sortable.js

Перепробовав массу разных способов сделать это, я наткнулся на этот пример и смог отработать его форму там.

Вот переход и копия кода на всякий случай:

    // create angular app
    var tagsApp = angular.module('tagsApp', ['ng-sortable']);

    tagsApp.controller('bugTagController', ['$scope', function($scope) {
      $scope.tags = [
        'Beans',
        'Potatoes'
      ];

      $scope.bugTagControllerConfig = {
        group: 'tags',
        pull: true,
        put: true,
        sort: true,
        animation: 150,
        draggable: '.list-group-item',
        filter: '.js-remove',
        chosenClass: ".sortable-chosen",
        accept: function(sourceItemHandleScope, destSortableScope) {
          console.log('masterTagController:accept');
          return true;
        },
        onStart: function(evt) {
          console.log('masterTagController:onStart');
        },
        onEnd: function(evt) {
          console.log('masterTagController:onEnd');
        },
        onAdd: function(evt) {
          console.log('masterTagController:onAdd');
        },
        onRemove: function(evt) {
          console.log('masterTagController:onAdd');
        },

        onFilter: function(evt) {
          var el = masterTags.closest(evt.item); // get dragged item
          el && el.parentNode.removeChild(el);
          console.log('masterTagController:onFilter');
        },
        onSort: function(evt) {
          console.log('masterTagController:onSort');
          var $item = $(evt.item);
          var id = $item.data('id');
          if (evt.action === 'add') {
            console.log('masterTagController:add');
            // put a check to make sure it's unique
            // check to see if this node has already been added  and prevent it it has
            var itemCount = evt.item.parentNode.children.length;

            for (var i = 0; i < itemCount; i++) {
              var $child = $(evt.item.parentNode.children[i]);
              var childId = $child.data('id');

              if (childId === id && i !== evt.newIndex) {
                console.log('masterTagController:rejectedNewItem');
                evt.preventDefault();
                return;
              }
            }

            if (evt.newIndex === itemCount - 1) {
              Sortable.utils.swap(evt.item.parentNode, evt.newIndex, evt.newIndex - 1);
            }
          }
        }

      };
    }]);

    tagsApp.controller('masterTagController', ['$scope', function($scope) {
      $scope.tags = [
        'Apples',
        'Oranges',
        'Comquats',
        'Bannanas',
        'Pineapples'
      ];

      $scope.masterTagControllerConfig = {
        group: 'tags',
        pull: true,
        put: true,
        sort: true,
        animation: 150,
        draggable: '.list-group-item',
        filter: '.js-remove',
        chosenClass: ".sortable-chosen",
        accept: function(sourceItemHandleScope, destSortableScope) {
          console.log('masterTagController:accept');
          return true
        },
        onStart: function(evt) {
          console.log('masterTagController:onStart');
        },
        onEnd: function(evt) {
          console.log('masterTagController:onEnd');
        },
        onAdd: function(evt) {
          console.log('masterTagController:onAdd');
        },
        onRemove: function(evt) {
          console.log('masterTagController:onAdd');
        },

        onFilter: function(evt) {
          var el = masterTags.closest(evt.item); // get dragged item
          el && el.parentNode.removeChild(el);
          console.log('masterTagController:onFilter');
        },
        onSort: function(evt) {
          console.log('masterTagController:onSort');
          var $item = $(evt.item);
          var id = $item.data('id');
          if (evt.action === 'add') {
            console.log('masterTagController:add');
            // put a check to make sure it's unique
            // check to see if this node has already been added  and prevent it it has
            var itemCount = evt.item.parentNode.children.length;

            for (var i = 0; i < itemCount; i++) {
              var $child = $(evt.item.parentNode.children[i]);
              var childId = $child.data('id');

              if (childId === id && i !== evt.newIndex) {
                console.log('masterTagController:rejectedNewItem');
                evt.preventDefault();
                return;
              }
            }

            if (evt.newIndex === itemCount - 1) {
              Sortable.utils.swap(evt.item.parentNode, evt.newIndex, evt.newIndex - 1);
            }
          }
        }

      };
    }]);

А вот html:

    <!DOCTYPE html>
    <html>

    <head>
      <link rel="stylesheet" href="style.css">
    </head>

    <body>
      <div ng-app="tagsApp">
        <!-- Starting Secondary Tags -->
        <div class="col-md-2">
          <h2>Tags on this list</h2>
          <div class="well" ng-controller="bugTagController">
            <ul id="bugTags" class="list-group" ng-sortable="bugTagControllerConfig" ng-model="tags" style="well-lg">
              <li class="list-group-item" ng-repeat="tag in tags" ng-sortable-item style="well-lg">
                <div ng-sortable-item-handle>{{ tag }}</div>
              </li>
            </ul>
          </div>
        </div>
        <!-- Ending Secondary Tags -->

        <!-- Starting Master Tags -->
        <div class="col-md-2">
          <h2>Master Tag List</h2>
          <div class="well" ng-controller="masterTagController">
            <ul id="masterTags" class="list-group" ng-sortable="masterTagControllerConfig" ng-model="tags" style="well-lg">
              <li class="list-group-item" ng-repeat="tag in tags" ng-sortable-item style="well-lg">
                <div ng-sortable-item-handle>{{ tag }}</div>
              </li>
            </ul>
          </div>
          <!-- Ending Master Tags -->
        </div>
      </div>
      <script type="text/javascript" src="https://code.jquery.com/jquery-3.1.0.js" integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk=" crossorigin="anonymous"></script>
      <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
      <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.js"></script>
      <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular-route.js"></script>
      <script type="text/javascript" src="https://rubaxa.github.io/Sortable/Sortable.js"></script>
      <script type="text/javascript" src="ng-sortable.js"></script>
      <script src="script.js"></script>
    </body>

    </html>
person Steve Sheppard    schedule 21.09.2016