PrimeNG Turbotable расширяется по умолчанию

У меня есть турборежим PrimeNg с возможностью расширения ряда.

Как я могу расширить строки по умолчанию.

Вот мой код:

HTML

<p-table [columns]="cols" [value]="cars" dataKey="vin">
<ng-template pTemplate="header" let-columns>
    <tr>
        <th style="width: 2.25em"></th>
        <th *ngFor="let col of columns">
            {{col.header}}
        </th>
    </tr>
</ng-template>
<ng-template pTemplate="body" let-rowData let-expanded="expanded" let-columns="columns">
    <tr>
        <td>
            <a href="#" [pRowToggler]="rowData">
                <i [ngClass]="expanded ? 'fa fa-fw fa-chevron-circle-down' : 'fa fa-fw fa-chevron-circle-right'"></i>
            </a>
        </td>
        <td *ngFor="let col of columns">
            {{rowData[col.field]}}
        </td>
    </tr>
</ng-template>
<ng-template pTemplate="rowexpansion" let-rowData let-columns="columns">
    <tr>
        <td [attr.colspan]="columns.length + 1">
            <div class="ui-g ui-fluid" style="font-size:16px;padding:20px">
                <div class="ui-g-12 ui-md-3" style="text-align:center">
                    <img [attr.alt]="rowData.brand" src="assets/showcase/images/demo/car/{{rowData.brand}}.png">
                </div>
                <div class="ui-g-12 ui-md-9">
                    <div class="ui-g">
                        <div class="ui-g-12">
                            <b>Vin:</b> {{rowData.vin}}
                        </div>
                        <div class="ui-g-12">
                            <b>Vin:</b> {{rowData.color}}
                        </div>
                        <div class="ui-g-12">
                            <b>Brand:</b> {{rowData.brand}}
                        </div>
                        <div class="ui-g-12">
                            <b>Color:</b> {{rowData.color}}
                        </div>
                    </div>
                </div>
            </div>
        </td>
    </tr>
  </ng-template>
</p-table>

Ц.

export class TableRowExpansionDemo implements OnInit {

    cars: Car[];

    cols: any[];

    constructor(private carService: CarService) { }

    ngOnInit() {
        this.carService.getCarsSmall().then(cars => this.cars = cars);

        this.cols = [
            { field: 'vin', header: 'Vin' },
            { field: 'year', header: 'Year' },
            { field: 'brand', header: 'Brand' },
            { field: 'color', header: 'Color' }
        ];
        }
    }
}

Я попытался с помощью атрибута expandedRowKeys, но он не работает для меня.

Что мне здесь не хватает?

Спасибо

Ответ 1

Обновление: для версии> 7.x

Установка значения в 1 не будет работать в версии 7+, используйте логическое значение (true/false)

const thisRef = this;
 this.cars.forEach(function(car) {
   thisRef.expandedRows[car.vin] = true;
 });

Работая StackBlitz

Для версии & lt; 7.x

Я попытался использовать атрибут extendedRowKeys

Да, ты прав. Поэтому добавьте [expandedRowKeys]="expandedRows"> к элементу p-table:

<p-table [columns]="cols" [value]="cars" dataKey="vin" [expandedRowKeys]="expandedRows">

а затем вам просто нужно заполнить объект expandedRows значениями vin строк, которые вы хотите раскрыть (поскольку dataKey - это vin).

Поскольку вы хотите, чтобы все строки были расширены, вы можете заполнить его следующим образом:

    const thisRef = this;
    this.cars.forEach(function(car) {
      thisRef.expandedRows[car.vin] = 1;
    });

для того, чтобы иметь что-то вроде expandedRows = {"dsad231ff": 1, "gwregre345": 1, ...}

Смотри работающий Плункер

Ответ 2

В принятом ответе, отображение expandedRows к столу expandedRowKeys турбо является одним из способов т.е. он может установить состояние строк в момент загрузки только. Если кто - то хочет, чтобы свернуть или развернуть его после загрузки таблицы, вы можете напрямую редактировать переменную "expandedRowKeys", передавая ссылку таблицы из HTML.

Определите вашу таблицу с помощью ссылочной переменной #dt

<p-table #dt [columns]="cols" [value]="cars" dataKey="vin">

Отредактируйте тело таблицы следующим образом, чтобы получить триггер функции при нажатии.

<ng-template pTemplate="body" let-rowData let-expanded="expanded" let-columns="columns">
    <tr>
        <td>
            <a href="#" [pRowToggler]="rowData">
                <i [ngClass]="expanded ? 'fa fa-fw fa-chevron-circle-down' : 'fa fa-fw fa-chevron-circle-right'"></i>
            </a>
        </td>
        <td *ngFor="let col of columns">
           <a >
              <span (click)="onItemClick(rowData, dt)">
                    {{rowData[col.field]}}    
              </span>
           </a>
        </td>
    </tr>
</ng-template>

в вашем файле TS добавьте функцию как

onItemClick(rowData:any, dt:any) {
   if(dt.expandedRowKeys[rowData._id]){
     dt.expandedRowKeys[rowData._id] = 0;
   }
   else {
    dt.expandedRowKeys[rowData._id] = 1;
   }
}

Такой подход дает вам больше свободы в изменении состояния таблицы при запуске события из-за пределов таблицы и развертывании или сворачивании нескольких строк одновременно.

Ответ 3

После достижения многих решений я попытался найти самый простой способ решения

<p-table [columns]="cols" [value]="cars" dataKey="vin" [expandedRowKeys]="expandedRows">

Замените значение datakey на ваш уникальный ключ id из списка объектов, извлеченных из вызовов службы или http.

<p-table [columns]="cols" [value]="repaymentsList" dataKey="id" expandableRows="true" rowExpandMode="single" [responsive]="true">