Kendo UI Angular 2+ Сортируемая ручка перетаскивания

Я использую сортируемый компонент из библиотеки Kendo UI Angular 2 для создания списка пользовательских компонентов, которые пользователь может перетаскивать, чтобы изменить порядок по мере необходимости. По умолчанию элементы сортировки можно перетаскивать, щелкнув в любом месте элемента. Мой вопрос: можем ли мы указать дескриптор, как в классическом пользовательском интерфейсе Kendo? Я хочу, чтобы пользователь перетаскивал элемент только при использовании заголовка элемента, а не тела.

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

Спасибо.


person dpdragnev    schedule 20.06.2017    source источник


Ответы (2)


Без доступа к исходному коду TypeScript (имеется доступ только к транспилированному JavaScript) трудно сказать, но, основываясь на моем быстром изучении, ответ — нет. Он не поддерживает параметры, такие как версия JavaScript Kendo UI, где вы можете указать селектор дескриптора.

Если у вас есть элемент дескриптора, согласно документам, вы должны добавить атрибут draggable="true" к своему элементу в шаблоне Sortable.

См. http://www.telerik.com/kendo-angular-ui/components/sortable/#toc-known-limitations

<kendo-sortable [data]="items">
  <ng-template let-item="item">
    <button draggable="true">
      {{item}}
    </button>
  </ng-template>
</kendo-sortable>

Мой опыт работы с этим компонентом Kendo Angular не так уж велик. У меня есть своя открытая проблема с этим. Кажется, это не работает хорошо за пределами узкой области.

На данный момент, по крайней мере, в моем проекте мы будем использовать Dragula. Для него доступна оболочка Angular2+. Он поддерживает ручки и тому подобное в своих опциях.

https://github.com/valor-software/ng2-dragula

person cp79shark    schedule 14.09.2017
comment
Что я пытаюсь понять о кендо, так это откуда взялось это имя переменной item? Это автоматически назначается? Что, если я захочу изменить его? - person Inigo; 24.11.2017
comment
Элемент @Inigo или то, что элемент управления вызывает, свойство определяется в контексте шаблона, поэтому да, назначается автоматически. Если вы хотите изменить имя, вы должны изменить оператор let let-whateverIwant="item" - person cp79shark; 29.01.2018

Я знаю, что прошли годы с тех пор, как был задан этот первоначальный вопрос, но на момент написания этой статьи кендо по-прежнему не поддерживает механизм ручки. Однако есть способ реализовать функцию дескриптора, который я напишу здесь в надежде, что кто-то в будущем может найти его полезным. Примечание. Я не считаю, что это правильное решение, потому что считаю, что API Kendo должен иметь эту функцию.

Использование мыши

Предотвратить перетаскивание

Когда мы начинаем перетаскивать виджет, мы хотим, чтобы перетаскивание происходило только в том случае, если наша мышь находится над допустимым дескриптором.

Определите флаг в коде вашего компонента.

/** whether we should allow dragging **/
allowDrag: boolean = false;

Прослушивание dragStart в элементе kendo-sortable

<kendo-sortable (dragStart)="onDragStart($event)">

Остановить событие dragStart по умолчанию когда флаг равен true

/** handles the starting of dragging */
onDragStart(e: DragStartEvent): void {
    if (!this.allowDrag) {
        e.preventDefault();
        return;
    }
}

Переключение при наведении мыши и выходе из мыши

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

<div (mouseover)="allowDrag = true" (mouseleave)="allowDrag = false" class="drag-handle"></div>

Включение пользователей с сенсорным экраном

Философия описанного выше подхода основывается только на прослушивании событий mouseover и mouseleave в дескрипторе и игнорировании всего остального. Для мобильных устройств это немного сложнее, потому что нет положения мыши, которое конкретно определяет, находится ли пользователь в положении для перетаскивания. Итак, мы должны добавить прослушиватель для обработки элементов, а также для всех других элементов, не являющихся дескрипторами, которые мы не хотим перетаскивать. Этот подход можно было бы использовать и для щелчков мышью, хотя я считаю, что лучшим подходом является только присоединение к элементам ручки.

Примечание. Я еще не полностью протестировал этот подход, и он может не подходить для всех условий и не работать должным образом для всех пользователей.

Добавьте событие touchstart

В вашем представлении прислушивайтесь к прикосновению к ручке

<div (touchstart)="allowDrag = true" (mouseover)="allowDrag = true"
    (mouseleave)="allowDrag = false" class="drag-handle"></div>

Также включая касание всего, что не является ручкой

<div (touchstart)="allowDrag = false">
My non-draggable thing
</div>
person luxdvie    schedule 13.09.2020
comment
Не слишком ли обременительно устанавливать (touchstart)="allowDrag = false" для всего, что не является дескриптором? Вы можете пропустить это, если установите allowDrag на false на dragStart? - person dimodi; 17.11.2020
comment
@dimodi Да - это может быть очень громоздким в зависимости от сложности HTML. Как вы говорите, может быть лучший способ сделать это в dragStart - возможно, передав перетаскиваемый элемент и оценив, должен ли он быть перетаскиваемым (на основе свойства/класса/атрибута). Я не всегда могу отключить перетаскивание на dragStart, потому что некоторые вещи должны быть перетаскиваемыми. Я знаю, что есть и другие способы сделать это... это то, что сработало для меня и не было очень громоздким в моем коде. - person luxdvie; 18.11.2020