Interact.js — перетаскивание одного div «прыгающего» в Ember

#ember.js #draggable #interact.js

#ember.js #перетаскиваемый #interact.js

Вопрос:

Я использую Ember, и я пытаюсь настроить простой перетаскиваемый пример div, используя interact.js библиотека, но у меня возникли некоторые проблемы.

Я знаю, что библиотека НЕ изменяет DOM, и вам нужно сделать это самостоятельно, и это нормально. Я следую примеру на веб-сайте, но перевожу его на Ember:

https://interactjs.io/docs/draggable

Вот что я сделал:

Шаг №1: Создайте шаблон Ember с помощью простого DIV

 <div
    role="button"
    class="draggable-card w-20 h-20"
/> 

Тег «перетаскиваемая карта» станет «интерактивным», когда я вызову библиотеку interact в контроллере.

Шаг № 2: создайте контроллер Ember

Контроллер работает как «код позади» и контролирует состояние. В этом случае наш контроллер выполняет ряд действий:

2.1 Вызывает библиотеку Interact, чтобы сделать объекты DOM «интерактивными» (т.е. перетаскиваемыми).

 this.draggableCards = interact('.draggable-card');

this.draggableCards.draggable({
    origin: 'self',
    inertia: false,
    listeners: {
        start: this.dragStart,
        move: this.dragMove,
        end: this.dragEnd
    }
}); 

Это делает все элементы «перетаскиваемой карты» перетаскиваемыми, а также создает обработчики перетаскивания для dragStart, dragMove и dragEnd.

2.2 Создайте обработчик события dragStart

 @action
dragStart(event) {
    this.isDraggingCard = true;

    // modify dom to support dragging the element
    event.target.style.position = 'relative';
    event.target.style.touchAction = 'none';
    event.target.style.userSelect = 'none';       
    event.target.style.left = '0px';
    event.target.style.top = '0px';

    // used to track position from start of drag
    this.dragCardPositionDelta = { dx: 0, dy: 0 };     
}; 

2.3 Создайте обработчик события dragMove

 @action
dragMove(event) {
    this.dragCardPositionDelta.dx  = event.dx;
    this.dragCardPositionDelta.dy  = event.dy;

    event.target.style.transform =
        `translate(
            ${this.dragCardPositionDelta.dx}px,
            ${this.dragCardPositionDelta.dy}px
        )`;
};   

Насколько я понимаю, (event.dx, event.dy) указывает количество пикселей, на которые элемент был перемещен с момента последнего вызова dragMove. Я отслеживаю (dragCardPositionDelta.dx и dragCardPositionDelta.dy), который отслеживает пиксели, которые элемент переместил с момента начала перетаскивания.

Настройка этого делает элемент перетаскиваемым, но (event.dx, event.dy), похоже, не вычисляется правильно при перетаскивании. В результате div прыгает по месту. Я также замечаю, что div не перемещается последовательно с указателем. Все это очень странно, и, учитывая, насколько прост пример на веб-сайте, я не уверен, что происходит не так. Я могу только подозревать, что для некоторых (event.dx, event.dy) вычисляется неправильно.

Я настроил аналогичный пример с другой библиотекой: Draggabilly (https://draggabilly.desandro.com ) и это в значительной степени работало из коробки, но я временно отказался от него из-за некоторых проблем, таким образом, опробовав Interact.js .

Любая помощь будет оценена.

Спасибо,

Дэйв

Комментарии:

1. Это может помочь, если вы соберете это вместе в ember twiddle.

2. Привет @Gaurav — я попытался настроить Ember Twiddle, но не смог заставить его работать с Interact.is . Я мог бы попробовать еще раз. Я также начал с Ember CodeSandbox и тоже не смог заставить его работать.

3. Я создал twiddle, но он не будет отображаться, когда я включу код контроллера. Вот в чем проблема: ember-twiddle.com /. … Если бы вы могли взглянуть, я был бы очень признателен. Этот простой пример, по крайней мере, выполняется локально и демонстрирует неправильное поведение.

4. Я исправил interact.js зависимость здесь: ember-twiddle.com /…

5. Я не уверен почему, но удаление origin: 'self' устранило проблему в twiddle.

Ответ №1:

После некоторых экспериментов с этой вертушкой для тлеющих углей: https://ember-twiddle.com/b9adfc02c351f881b05c7032d18812e7?openFiles=controllers.application.js,

Я обнаружил, что удаление origin: 'self' из вызова перетаскиваемого исправило перескакивание. Я не знаю почему.