我尝试将Angular DataTables与server side processing选项一起使用,但当我尝试在" Angular way example"中启用它时,只有第一个请求被呈现,后续请求(分页,排序,搜索)被发送,但它们永远不会更新表。
答案 0 :(得分:6)
经过一番挖掘后,我发现了一个不相关的user contributed note,表明您使用自己的函数覆盖ajax
选项来处理服务器端调用。
这里的技巧是将一个空数组返回给DataTables回调,因此它不会使用它的渲染器来渲染表。这将由Angular完成。为服务器指定列名称也是一个好主意。
ngOnInit(): void {
var that = this;
this.dtOptions = {
pagingType: 'full_numbers',
serverSide: true,
processing: true,
ajax: (dataTablesParameters: any, callback) => {
that.http
.post<DataTablesResponse>('/api/Persons', dataTablesParameters, {})
.subscribe(resp => {
that.persons = resp.data;
callback({
recordsTotal: resp.recordsTotal,
recordsFiltered: resp.recordsFiltered,
data: [],
});
});
},
columns: [
{ data: "id" },
{ data: "firstName" },
{ data: "lastName" },
],
};
}
由于DataTables会认为没有要显示的行,它会显示&#34;没有可用的数据&#34;信息。处理它的最简单方法是使用CSS隐藏它。您可以将其添加到global styles.css:
.dataTables_empty {
display: none;
}
然后在模板中自己展示:
<tr *ngIf="persons?.length == 0">
<td colspan="3" class="no-data-available">No data!</td>
</tr>
所以这里是完整的代码。使用Angular 5.0.0,datatables.net 1.10.16和angular-datatables 5.0.0进行测试:
<强>角方式 - 服务器 - side.component.ts 强>
import { Component, OnInit } from '@angular/core';
import { HttpClient, HttpResponse } from '@angular/common/http';
import { DataTablesResponse } from '../datatables/datatables-response';
import { Person } from './person';
@Component({
selector: 'app-angular-way-server-side',
templateUrl: 'angular-way-server-side.component.html',
styleUrls: ['angular-way-server-side.component.css'],
})
export class AngularWayServerSideComponent implements OnInit {
dtOptions: DataTables.Settings = {};
persons: Person[];
constructor(private http: HttpClient) { }
ngOnInit(): void {
var that = this;
this.dtOptions = {
pagingType: 'full_numbers',
serverSide: true,
processing: true,
ajax: (dataTablesParameters: any, callback) => {
that.http
.post<DataTablesResponse>('/api/Persons', dataTablesParameters, {})
.subscribe(resp => {
that.persons = resp.data;
callback({
recordsTotal: resp.recordsTotal,
recordsFiltered: resp.recordsFiltered,
data: [],
});
});
},
columns: [
{ data: "id" },
{ data: "firstName" },
{ data: "lastName" },
],
};
}
}
<强>角方式 - 服务器 - side.component.html 强>
<table datatable [dtOptions]="dtOptions" class="row-border hover">
<thead>
<tr>
<th>ID</th>
<th>First name</th>
<th>Last name</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let person of persons">
<td>{{ person.id }}</td>
<td>{{ person.firstName }}</td>
<td>{{ person.lastName }}</td>
</tr>
<tr *ngIf="persons?.length == 0">
<td colspan="3" class="no-data-available">No data!</td>
</tr>
</tbody>
</table>
<强>角方式 - 服务器 - side.component.css 强>
.no-data-available {
text-align: center;
}
<强> person.ts 强>
export class Person {
id: number;
firstName: string;
lastName: string;
}
<强>数据表-response.ts 强>
export class DataTablesResponse {
data: any[];
draw: number;
recordsFiltered: number;
recordsTotal: number;
}
<强>的src / styles.css的强>
.dataTables_empty {
display: none;
}
服务器端的实现方式与使用DataTables和JavaScript / jQuery的方式非常相似。您可以看到very simple sample implementation in PHP。
答案 1 :(得分:0)
我们能否仅在输入时搜索数据以减少使用角度的服务器调用?如何解除绑定并成角度绑定?