Я следую за сообщением здесь о том, как реализовать обработку server-side
для Datatable
.
Как видно из названия этого поста, я получаю следующую ошибку:
ОШИБКА DOMException: не удалось выполнить removeChild на узле:
удаляемый узел не является дочерним узлом этого узла.
У меня такое ощущение, что я не устанавливаю свойство columns
в dtOptions
, как в посте. Я точно не хочу делать это таким образом, поскольку у меня есть какой-то пользовательский рендеринг, который я хотел бы сделать в своем html-шаблоне.
Вот мой код шаблона:
<div class="card">
<div class="card-body">
<h5>Filter</h5>
</div>
</div>
<div class="card">
<div class="card-body">
<ng-container *ngIf="dataArray">
<table datatable [dtOptions]="dtOptions" class="row-border hover">
<thead>
<tr>
<th *ngFor="let columnSetting of columnSettings">
{{ columnSetting.FriendlyName }}
</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let model of dataArray">
<td *ngFor="let setting of columnSettings">
<div *ngIf="setting.IsString">
{{ model[setting.PropertyName] }}
</div>
<div *ngIf="setting.IsBoolean">
<!-- <fa name="check" animation="spin"></fa> -->
</div>
</td>
</tr>
</tbody>
</table>
</ng-container>
</div>
</div>
Вот мой component.ts
файл:
export class DatatableComponent implements OnInit, AfterViewInit, OnDestroy {
// @Input() modelObservable: Observable<any[]>;
@Input() modelTypeName: string;
@Input() showAddButton: boolean;
@Input() serverUrl: string;
dtTrigger: Subject<unknown> = new Subject();
dtOptions: DataTables.Settings = {};
columnSettings: IColumnSettings[];
dataArray: any[] = [];
constructor(private httpClient: HttpClient) { }
ngOnInit(): void {
this.loadDtOptions();
this.loadColumnSettings();
}
ngAfterViewInit() {
this.dtTrigger.next();
}
ngOnDestroy(): void {
this.dtTrigger.unsubscribe();
}
private loadDtOptions(): void {
const that = this;
this.dtOptions = {
pagingType: "full_numbers",
pageLength: 25,
serverSide: true,
processing: true,
ajax: (searchParams: any, callback) => {
that.httpClient.post<IListingResponse>(that.serverUrl, searchParams, {})
.subscribe(resp => {
console.log('resp', resp);
that.dataArray = resp.Data;
callback({
recordsTotal: resp.TotalRecords,
recordsFiltered: resp.FilteredRecords,
data: []
});
});
}
}
}
private loadColumnSettings(): void {
if (this.modelTypeName) {
this.columnSettings = (<IColumnSettings[]>dataTableConfig[this.modelTypeName]).filter(x => x.IsVisible);
}
}
}
Как вы увидите, я заполняю columnSettings
1025 * следующим образом:
Вот мой IColumnSetting
интерфейс:
export interface IColumnSettings {
IsPrimaryKey: boolean;
PropertyName: string;
FriendlyName: string;
IsDate: boolean;
IsString: boolean;
IsBoolean: boolean;
IsVisible: boolean;
}
Мой фактический dataTableConfig.ts
в папке окружений:
export const dataTableConfig = {
person: [
{ IsPrimaryKey: true, PropertyName: 'id', FriendlyName: '#', IsString: true, IsDate: false, IsBoolean: false, IsVisible: true },
{ IsPrimaryKey: true, PropertyName: 'firstname', FriendlyName: 'FirstName', IsString: true, IsDate: false, IsBoolean: false, IsVisible: true },
{ IsPrimaryKey: true, PropertyName: 'Lastname', FriendlyName: 'LastName', IsString: true, IsDate: false, IsBoolean: false, IsVisible: true },
{ IsPrimaryKey: true, PropertyName: 'Username', FriendlyName: 'Username', IsString: true, IsDate: false, IsBoolean: false, IsVisible: true },
{ IsPrimaryKey: true, PropertyName: 'IsArchived', FriendlyName: 'Active', IsString: false, IsDate: false, IsBoolean: true, IsVisible: true }
],
}
Почему я получаю эту ошибку?