Компонент Datatable в Angular 7 проблема с отзывчивостью при извлечении данных из бэкэнда - PullRequest
0 голосов
/ 09 июля 2019

Я создал компонент таблицы данных в Angular, который принимает в качестве входных данных объект конфигурации, который устанавливает таблицу и отображает таблицу на основе этих конфигураций.

Мой компонент работает в2 режима: 1. Вы можете предоставить данные как часть файла конфигурации для отображения в таблице.2. Вы можете предоставить URL-адрес API, настроенный с ответами на пейджинг, чтобы сделать данные доступными для отображения данных непосредственно из бэкэнда с пейджингом.

Формат файла конфигурации, который нужен моему компоненту в качестве ввода:

export interface DataTableConfig {
    remove?: action;
    more?: action;
    data?: Array<any>;
    pageSize?: number;
    ajax?: {
        URL: string;
        headers: HttpHeaders;
        pathToProperty: string;
        firstPage?: number;
    };
    columns: Array<column>;
}

interface column {
    title: string;
    data: string;
    width?: string;
    responsivePriority?: number;
    dateFormat?: String;
    orderable?: boolean;
    class?: string;
    icon?: {
        iconName: string;
        isTrue?: string;
        color?: string;
    };
}

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

Я выполнилэто при первом режиме использования моих таблиц данных (предоставленные данные), но во втором случае, когда я выбираю данные из бэкэнда на страницах, отзывчивость столбцов исчезает.Я не могу понять почему.

Я предоставляю свой HTML-код и конструкцию объекта конфигурации из таблицы данных ниже.Кто-нибудь знает решение?

HTML-код

<ng-container *ngIf="dtOptions">
<table datatable [dtOptions]="dtOptions" [dtTrigger]="dtTrigger" class="row-border hover">
<tbody>
  <ng-container *ngFor="let element of configuration.data">
    <tr>
      <ng-container *ngFor="let column of configuration.columns">
        <ng-container *ngIf="column.data && column.title && !column.dateFormat">
          <td>
            <div class="align-icon-text">
              <ng-container *ngIf="column.icon">
                <mat-icon [style.color]="column.icon.color" class="icon" *ngIf="showIcon(element,column)">
                  {{column.icon.iconName}}</mat-icon>
              </ng-container>
              <span *ngIf="column.data">{{showValue(element, column.data)}}</span>
            </div>
          </td>
        </ng-container>
        <ng-container *ngIf="column.data && column.title && column.dateFormat">
          <td>
            <div class="align-icon-text">
              <ng-container *ngIf="column.icon">
                <mat-icon [style.color]="column.icon.color" class="icon" *ngIf="showIcon(element,column)">
                  {{column.icon.iconName}}</mat-icon>
              </ng-container>
              <span *ngIf="column.data">{{showValue(element, column.data) | date: column.dateFormat}}</span>
            </div>
          </td>
        </ng-container>

        <td (click)="deleteRow(element)" *ngIf="configuration.remove && column.data=='remove' && !column.title"
          matTooltip="{{configuration.remove.tooltip}}">
          <button mat-icon-button>
            <mat-icon>{{configuration.remove.icon}}</mat-icon>
          </button>
        </td>
        <td (click)="showMore(element)" *ngIf="configuration.more && column.data=='more' && !column.title"
          matTooltip="{{configuration.more.tooltip}}">
          <button mat-icon-button>
            <mat-icon>{{configuration.more.icon}}</mat-icon>
          </button>
        </td>
      </ng-container>
    </tr>
  </ng-container>
</tbody>
<tbody *ngIf="configuration.data?.length == 0">
  <tr style="width: 100% !important">
    <td class="no-data-available" [attr.colspan]="numberOfColumns">No data available</td>
  </tr>
</tbody>

Построение dtOptions

    var pageSize = this.configuration.pageSize || 10;
if (this.configuration.ajax) {
  this.dtOptions = {
    // processing: true,
    ajax: (dtParameters: any, callback) => {
      var URL = this.configuration.ajax.URL;
      if (this.configuration.ajax) {
        var currentPage = (parseInt(dtParameters['start']) + parseInt(dtParameters['length'])) / pageSize;
        URL = `${URL}?page=${currentPage - 1}&pageSize=${pageSize}`
      }
      this.crud.get(URL, this.configuration.ajax.headers).subscribe((res) => {
        this.configuration.data = this.getObjectByPath(res);
        callback({
          recordsTotal: res['paging']['total'],
          recordsFiltered: res['paging']['total'],
          data: []
        })
      })
    },
    dom: 'Bfrtip',
    bLengthChange: false,
    bFilter: true,
    bInfo: false,
    bAutoWidth: false,
    pageLength: pageSize,
    order: [],
    serverSide: true,
    pagingType: 'full_numbers',
    columns: this.configuration.columns,
    responsive: true,
    language: {
      search: 'Filter: '
    },
    buttons: [
      {
        extend: 'print',
        exportOptions: {
          columns: "thead th:not(.noExport)"
        }
      },
      {
        extend: 'excel',
        exportOptions: {
          columns: "thead th:not(.noExport)"
        }
      },
      {
        extend: 'csv',
        exportOptions: {
          columns: "thead th:not(.noExport)"
        }
      }
    ]
  };
} else if (this.configuration.data) {
  if (typeof this.configuration.data === 'object' && !(this.configuration.data instanceof Array)) {
    this.configuration.data = [this.configuration.data];
  }
  this.dtOptions = {
    bLengthChange: false,
    bFilter: true,
    bInfo: false,
    bAutoWidth: false,
    pageLength: pageSize,
    order: [],
    dom: 'Bfrtip',
    pagingType: 'full_numbers',
    columns: this.configuration.columns,
    responsive: true,
    language: {
      search: 'Filter: '
    },
    buttons: [
      {
        extend: 'print',
        exportOptions: {
          columns: "thead th:not(.noExport)"
        }
      },
      {
        extend: 'excel',
        exportOptions: {
          columns: "thead th:not(.noExport)"
        }
      },
      {
        extend: 'csv',
        exportOptions: {
          columns: "thead th:not(.noExport)"
        }
      }
    ]
  };
}

Текущая проблема enter image description here

Ожидаемое поведение enter image description here

1 Ответ

0 голосов
/ 15 июля 2019

У меня была похожая проблема, потому что у меня было несколько столбцов, которые я хотел найти, но не отображать.

Вам необходимо использовать «visible: false» для столбца, и если вы хотите показать их, тогда примените к нему видимость.

this.datatableElement.dtInstance.then((dtInstance: DataTables.Api) => {
  dtInstance.column(columnIndex).visible(true or false);
});
...