Я создал компонент строки заголовка для данных в виде таблицы в отчете, который позволяет сортировать по нескольким столбцам. Это довольно просто: одно свойство, две функции и @Output (), чтобы сообщить родительскому компоненту, когда порядок изменился.
Я бы хотел сейчас использовать этот компонент во всех других моих отчетах - у каждого будет одна и та же логика, но у каждого будет свое отображение.
Я знаю, чем могу добавить @Input () для reportType, а затем код * ngSwitch в моем шаблоне, но я бы хотел найти способ фактически изолировать HTML для каждого заголовка в свой собственный файл (возможно, со своим собственным файлом SCSS) без создания набора компонентов с точно такой же логикой.
Эта логика включена ниже просто для удовольствия.
import { Component, EventEmitter, Output } from '@angular/core';
@Component({
selector: 'sort-row',
templateUrl: './sort-row.component.html',
styleUrls: ['./sort-row.component.scss']
})
export class SortRowComponent {
sortOrder: string[] = [];
@Output() sortChanged: EventEmitter<string[]> = new EventEmitter<string[]>();
constructor() {}
sortingBy(field, dir?) {
if (dir) {
if (dir === 'desc') {
field = '-' + field;
}
return this.sortOrder.indexOf(field) !== -1;
} else {
return this.sortOrder.indexOf(field) !== -1 || this.sortOrder.indexOf('-' + field) !== -1;
}
}
toggleSortCol(col, evt) {
const ascIdx = this.sortOrder.indexOf(col);
const descIdx = this.sortOrder.indexOf('-' + col);
if (!evt.shiftKey) {
if (ascIdx !== -1) {
this.sortOrder = ['-' + col];
} else if (descIdx !== -1) {
this.sortOrder = [col.replace('-', '')];
} else {
this.sortOrder = [col];
}
} else {
if (ascIdx !== -1) {
this.sortOrder[ascIdx] = '-' + col;
} else if (descIdx !== -1) {
this.sortOrder[descIdx] = col.replace('-', '');
} else {
this.sortOrder.push(col);
}
}
this.sortChanged.next(this.sortOrder);
}
}