Как реализовать функцию перетаскивания в таблице материалов Angular?

Я могу реализовать функцию перетаскивания с помощью ng2-dragula, но проблема, с которой я сталкиваюсь, заключается в том, что он также перетаскивает строку заголовка, а также не может получить значения перетаскиваемой строки (данные ее строки) и строку выше и ниже из перетаскиваемый ряд.

Может ли кто-нибудь помочь мне в этом?

Я также нашел ту же проблему на github

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

<mat-table [dataSource]="dataSource"
               matSort matSortActive="categoryName" matSortDirection="asc" matSortDisableClear
               [dragula]='"seventh-bag"'>

        <ng-container matColumnDef="seqNo">

            <mat-header-cell *matHeaderCellDef>S.No.</mat-header-cell>

            <mat-cell *matCellDef="let row;let i=index;">
              {{(paginator.pageSize * (paginator.pageIndex)) + i+1}}
            </mat-cell>

        </ng-container>

        <ng-container matColumnDef="name">

            <mat-header-cell *matHeaderCellDef mat-sort-header (mouseenter)="nameIcon=false" (mouseleave)="nameIcon=true">
              Category Name
              <i *ngIf="nameIcon && sort.active=='join'" class="fa fa-sort"></i>
            </mat-header-cell>

            <mat-cell
                      *matCellDef="let catg;">
                     name
            </mat-cell>

        </ng-container>


        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>

        <mat-row *matRowDef="let row; columns: displayedColumns"
        (click)="selectedRow(row)" [ngClass]="{'highlight': selectedRowIndex == row._id}"
        (mouseenter) ="dragRow = row"  (mouseleave) ="mouseLeave('div A')"
        >
          {{row}}
        </mat-row>

    </mat-table>

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

2.) Когда я реализую ng2-dragula

 <mat-row *matRowDef="let row; columns: displayedColumns"
        (click)="selectedRow(row)"  [dragula]='"seventh-bag"'
        >

тогда функция перетаскивания не работает должным образом

Пожалуйста, обратитесь к картинке ниже

Когда ng2-dragula внедрил мат-строки, произошло следующее

Источник изображения: - https://user-images.githubusercontent.com/6483007/36256531-4a34b638-124b-11e8-9b13-cd15391886ae.gif


person VIKAS KOHLI    schedule 22.06.2018    source источник
comment
Привет, я борюсь с той же проблемой. Вы поняли это?   -  person greenskin    schedule 14.09.2018


Ответы (1)


Возможно, это не точный ответ на ваш вопрос о драгуле, но, видя, что никто еще не попробовал, вот возможное решение, которое, кажется, работает для меня: я также пытался заставить перетаскивание работать с матовым столом. Я не использовал ng2-dragula (в прошлом я использовал jquery ui-sortable), но я добился чего-то с новой системой перетаскивания CDK angulars. (сейчас в 7.0.0).

https://material.angular.io/cdk/drag-drop/overview

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

видя, что матовые таблицы, похоже, не созданы таким образом, чтобы хорошо работать с d&d, я обратился к спискам или панелям расширения (если вы хотите раскрывающийся список для расширенных форм в каждой строке), поскольку они, кажется, ведут себя лучше при вложении и хорошо работают с инструментами перетаскивания cdk. (вам, вероятно, потребуется сделать некоторые пользовательские стили, чтобы он выглядел как таблица)

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

Надеюсь, это даст вам что-то для работы!

person Tom    schedule 09.11.2018