Как реализовать перетаскивание с помощью angular 2 (v2.0.0-beta.15)

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

Iv реализовал его перед использованием https://github.com/akserg/ng2-dnd, но моя проблема в том, что я использую angular 2.0.0-beta.15, и я не могу сейчас обновлять поэтому мне нужно найти что-то, что поддерживает эту версию. Iv пытался найти конкретные коммиты этой библиотеки и ничего, что подходит мне. Мне нужно это точное поведение. более конкретный пример этой библиотеки -. Может быть, кто-то знает, что я могу сделать это сам, даже в любом случае будет хорошо, предпочитайте библиотеку, чтобы сэкономить время.

(im используя typescript)

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

Ответы

Ответ 1

Хорошо, так что в первую очередь спасибо людям, которые ответили.

Ответ, который помог мне больше всего в том, как исправить проблему, с которой я столкнулся с ng2-dnd:

Я просто добавил в devDependencies:

"ng2-dnd" : "1.5.0"

запустите npm install, и я был готов пойти и использовать библиотеку, как в примерах github.

Ответ 2

Существует два наиболее распространенных способа разрешить перетаскивание с помощью Angular 2. Сначала используйте одну из открытых библиотек с открытым исходным кодом Angular (их несколько); а во-вторых, используется библиотека jQuery UI для перетаскивания. После некоторого расследования я обнаружил, что большинство из них сделаны для Angular 1.x и по-прежнему не поддерживают все необходимые мне функции.

Итак, я решил сделать свою реализацию перетаскивания с помощью jQuery, используя его библиотеки TypeScript.

Чтобы поддерживать перетаскивание, начинайте с получения jQuery файлов JavaScript в моем проекте и index.html. После получения файлов jQuery перед использованием в проекте Angular + TypeScript для этого требуются jquery.d.ts и jqueryui.d.ts, которые дадут специфическую реализацию типа для перетаскивания.

Шаг 1

Выполните следующие команды в корневом каталоге проекта:

// install tsd
npm install tsd -g
// install jquery.d.ts
tsd install jquery --save
// install jqueryui.d.ts
tds install jqueryui --save

Выше команды установят специфическое для типа jQuery сопоставление типов в папку ввода проекта, как показано здесь.

введите описание изображения здесь

Шаг 2

Перетаскивание имеет два аспекта для реализации:

  • некоторый контейнер, который позволяет отбрасывать компонент внутри контейнера droppable
  • которому будет разрешено перетаскивать перетаскиваемый компонент

В моей реализации квадрат доски можно отбрасывать, когда куски можно отбросить, а куски можно перетаскивать, которые можно перетащить между двумя квадратами. Чтобы поддержать это, создайте существующий квадрат (html-шаблон), добавьте CSS-класс droppable-square, который будет использоваться позже, чтобы сделать квадратный droppable. И добавьте CSS class draggable-piece, чтобы сделать игру из шахматной фигуры.

<div *ngFor="let files of Board.Files, let i = index">
  <div class="board-square droppable-square" *ngFor="let rank of Board.Ranks, let j = index" [style.background]="Board.Squares[7-i][j].IsWhite ? '#FECE9E': 'D18B46'">
    <span class="square-name">{{Board.Squares[7-i][j].SquareId}}</span>
    <div *ngIf="Board.Squares[7-i][j].Piece" class="piece draggable-piece"></div>
  </div>
</div>

Шаг 3

Для реализации draggable и droppable создан новый класс с именем PieceMover, который имеет логику, чтобы сделать куски подвижными. Как показано в следующей кодовой базе, он делает выше классы CSS перетаскиваемыми и droppable, и помещает ограничения только на то, что кусок можно отбросить на квадрат, а не за пределы квадрата. Существует немного дополнительной логики для отображения границы в процессе перетаскивания, на котором фигуры наводятся.

введите описание изображения здесь

Инъекция зависимостей - Angular 2

Injection Dependency является одной из наиболее ценных функций Angular 2. Как и любые языки разработки на стороне сервера, такие как С#, Java позволяет иметь контейнер IoC для поддержки Injection Dependency, аналогично Angular 2 разрешает DI. Injection Dependency позволяет развязывать зависимости между классами и поддерживать модульное развитие. Как видно в коде класса PieceMover над классом, украшен @Injectable(), который указывает на контейнер DI Angular 2, который может быть введен в этот класс. Также обратите внимание на импорт Injectable в первой строке кода класса PieceMover.

Потребительский класс BoardComponent в этом случае использует массив "поставщиков" для конкретных зависимостей, которые должны быть разрешены контейнером Angular 2 DI. Конструктор принимает параметр типа PieceMover, который будет инжектирован/разрешен DI. После разрешения зависимостей, упомянутых выше, после отображения платы BoardComponent вызывается метод метода MakePiecesMovable(), который заставляет фигуры перемещаться на шахматные квадраты.

введите описание изображения здесь

UPD. Если вы не соглашаетесь с пользовательской реализацией, вы можете использовать некоторые библиотеки из этого списка:

Ответ 3

Вы можете использовать конкретную ревизию от Dragula 2 Github repo.

1 - откройте package.json и прокрутите до "dependencies"

2 - отредактируйте пакет ng2-dragula на ссылку Github с последним фиксацией до того, как они перейдут на RC.1.

"ng2-dragula": "git://github.com/valor-software/ng2-dragula.git#0cdcd52b1a486609ed4b4a43465b1dac2bb1b007"

3 - Удалите папку ng2-dragula в node_modules и переустановите ее из package.json с помощью

npm install