Невозможно перетащить элемент, если сортировка применяется к родительскому и дочернему элементу как в RubaXa Sortable

I created BIN "http://jsbin.com/cekarimaxu/1/edit?html,css,js,output" of my issue.

Здесь у меня есть такая структура, как STAGE -> На этапе есть карта.

Теперь и карточка, и сцена должны быть сортируемыми, а для сортировки я использую RubaXa sortable. Обратите внимание, что здесь я установил «forcefallback: true», потому что я хочу стилизовать перетаскиваемый элемент (как сцену, так и карты).

Теперь проблема, с которой я столкнулся, заключается в том, что я могу перетаскивать карты, но я не могу перетаскивать этапы. просмотр" rel="nofollow noreferrer">ВИДЕО

Желаемое поведение должно выглядеть примерно так: - ВИДЕО

Однако это желаемое поведение возникает, если я устанавливаю «forcefallback: false», и в моем случае я хочу применить некоторый пользовательский CSS к перетаскиваемому элементу, поэтому я не могу установить «forcefallback: false»


person Vandan Shah    schedule 23.03.2018    source источник


Ответы (1)


Я считаю, что проблема в том, как вы структурировали вложенные списки.

Ваша текущая реализация:

<div class="parent">
    <div class="list-group">Stage -1
        <div class="card">A</div>
        <div class="card">B</div>
        <div class="card">C</div>
    </div>
    <div class="list-group">Stage-2
        <div class="card">D</div>
        <div class="card">E</div>
        <div class="card">F</div>
    </div>
    <div class="list-group">Stage-3
        <div class="card">G</div>
        <div class="card">H</div>
        <div class="card">I</div>
    </div>    
</div>

Вместо этого вам нужно вложить дочернюю группу аналогично тому, как вы вложили родительскую группу. То есть в каждом div должны быть только перетаскиваемые элементы. Извините, если это плохое объяснение, но, возможно, пример будет иметь больше смысла. Вот как я реструктурировал ваш список, чтобы он работал:

<div class="parent">
  <div class="list-group">
    <div>Stage - 1</div>
    <div class="child">
      <div class="card">A</div>
      <div class="card">B</div>
      <div class="card">C</div>
    </div>
  </div>
  <div class="list-group">
    <div>Stage - 2</div>
    <div class="child">
      <div class="card">D</div>
      <div class="card">E</div>
      <div class="card">F</div>
    </div>
  </div>
  <div class="list-group">
    <div>Stage - 3</div>
    <div class="child">
      <div class="card">G</div>
      <div class="card">H</div>
      <div class="card">I</div>
    </div>
  </div>    
</div>

Обратите внимание на добавление элементов div.child.

Затем вы должны обновить свой javascript, чтобы он соответствовал этой новой структуре, например:

// Select parent group and make sortable
var parent = document.getElementsByClassName('parent');
new Sortable(parent[0], {
    group: {
        name: 'parent-group'
    },
    forceFallback: true,
    fallbackClass: 'clone',  
});

// Select our child group and make sortable
var child = document.getElementsByClassName('child')
for(var i = 0;i < child.length;i++) {
    new Sortable(child[i], {
        group: {
            name: 'child-group',
            pull: true,
        },
        forceFallback: true,
        fallbackClass: 'clone_card',  
    });
}

Это выберет родительскую группу, как у вас было изначально, но теперь вместо выбора элемента .list-group мы выбираем элемент .child, который содержит объекты, которые мы хотим перетащить.

Вот живой пример на jsbin, который вы можете посмотреть по ссылке:
http://jsbin.com/ronikomabi/edit?html,css,js,output

Чтобы ответить на ваш комментарий, вам нужно добавить минимальную ширину к контейнеру .child, чтобы у вас все еще была зона перетаскивания, в которую вы могли бы перетаскивать элементы, даже после того, как все элементы были удалены. Я обновил ссылку JSbin новой версией, которая устраняет эту проблему.

person Xander Luciano    schedule 03.04.2018
comment
Привет, Ксандер Лучано, спасибо за ваш ответ, и он работает нормально... Но если на сцене нет карт, я не могу перетаскивать карты. ПОСМОТРЕТЬ: - drive.google.com/file/d/1qnlgO9zwnnh7kfq0Y4XqrCb_OZz-O5Dx/view - person Vandan Shah; 04.04.2018
comment
@VandanShah Упс, я забыл добавить минимальную ширину в сортируемый контейнер. Я обновил свой ответ и ссылку :) Теперь должно работать нормально. Спасибо за видео о проблеме, это было очень полезно. - person Xander Luciano; 04.04.2018
comment
Привет, Ксандер Лучано, я столкнулся с одной проблемой при написании автоматизированного тестового примера для проверки перетаскивания в моем проекте, я разместил эту проблему на github. Было бы очень полезно, если бы вы могли ответить на этот вопрос. /Sortable/issues/1303 Спасибо. - person Vandan Shah; 06.04.2018
comment
Привет, Ксандер, Можете ли вы сказать мне, почему мне нужно это дополнительное движение мыши только на этапах, а не в картах, если я пишу автоматический тестовый набор для карт, он работает только с одним движением мыши, мне не нужно дополнительное движение мыши, как мудрецы? ПОСМОТРЕТЬ этот БИН: - jsbin.com/yutiwafeya/edit?js,output - person Vandan Shah; 09.04.2018
comment
@Vandan Shah Я постараюсь не забыть проверить через ~ 8 часов утра, но я помню, как пытался заставить его работать только с одним перетаскиванием, и ничего не сработало. Завтра можно попробовать разные вещи, чтобы понять, почему. Если я забуду, просто задайте вопрос здесь и отметьте меня в комментариях или ответьте со ссылкой, и я проверю это. - person Xander Luciano; 09.04.2018
comment
Привет, Ксандер, у тебя есть причина, по которой нам нужен этот дополнительный ход мыши только на сцене? - person Vandan Shah; 12.04.2018
comment
Привет, Ксандер, также возможно реализовать перетаскивание родитель-потомок без добавления этого дополнительного div, потому что я реализую эту функцию в существующем веб-приложении, поэтому я не могу изменить структуру существующего приложения... Пожалуйста, ответьте на этот вопрос ... Я застрял из-за этой проблемы Спасибо... - person Vandan Shah; 12.04.2018