如何在Angular中结合StartDate/EndDate实现分页数据筛选?
实现日期筛选+分页功能的代码修改方案
以下是针对Angular 14+ngx-bootstrap-datepicker+ngx-pagination结合ASP.Net Core 6 API的完整修改步骤:
1. 后端API调整(ASP.Net Core 6)
首先确保API接口支持接收日期筛选参数,并在查询时过滤CreatedAt字段:
[HttpGet] public async Task<IActionResult> GetItems( int page = 1, int pageSize = 10, DateTime? startDate = null, DateTime? endDate = null) { var query = _dbContext.Items.AsQueryable(); // 应用日期筛选逻辑 if (startDate.HasValue) { query = query.Where(i => i.CreatedAt >= startDate.Value); } if (endDate.HasValue) { query = query.Where(i => i.CreatedAt <= endDate.Value); } // 分页处理 var totalItems = await query.CountAsync(); var items = await query .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); return Ok(new { totalItems, items }); }
2. Angular Service修改
更新数据服务,添加日期筛选参数的传递逻辑:
import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable } from 'rxjs'; import { Item } from './models/item.model'; // 替换为你的数据模型 @Injectable({ providedIn: 'root' }) export class ItemService { private apiUrl = '/api/items'; // 替换为你的API地址 constructor(private http: HttpClient) {} // 新增日期筛选参数 getItems( page: number, pageSize: number, startDate?: Date, endDate?: Date ): Observable<{ totalItems: number; items: Item[] }> { let params = new HttpParams() .set('page', page.toString()) .set('pageSize', pageSize.toString()); // 处理日期参数,转换为API兼容的格式 if (startDate) { params = params.set('startDate', startDate.toISOString()); } if (endDate) { // 调整结束日期到当天23:59:59,避免遗漏当日数据 const adjustedEndDate = new Date(endDate); adjustedEndDate.setHours(23, 59, 59); params = params.set('endDate', adjustedEndDate.toISOString()); } return this.http.get<{ totalItems: number; items: Item[] }>(this.apiUrl, { params }); } }
3. Angular Component修改
添加日期变量、筛选逻辑,并关联分页事件:
import { Component, OnInit } from '@angular/core'; import { BsDatepickerConfig } from 'ngx-bootstrap/datepicker'; import { ItemService } from './item.service'; import { Item } from './models/item.model'; @Component({ selector: 'app-item-list', templateUrl: './item-list.component.html', styleUrls: ['./item-list.component.css'] }) export class ItemListComponent implements OnInit { items: Item[] = []; totalItems = 0; currentPage = 1; pageSize = 10; // 日期筛选变量 startDate?: Date; endDate?: Date; // 日期选择器配置 bsConfig?: Partial<BsDatepickerConfig>; constructor(private itemService: ItemService) {} ngOnInit(): void { // 初始化日期选择器样式与格式 this.bsConfig = { dateInputFormat: 'YYYY-MM-DD', containerClass: 'theme-blue' }; // 首次加载默认数据 this.loadItems(); } // 统一加载数据方法,支持分页与筛选参数 loadItems(page: number = this.currentPage): void { this.itemService.getItems(page, this.pageSize, this.startDate, this.endDate) .subscribe(response => { this.items = response.items; this.totalItems = response.totalItems; this.currentPage = page; }); } // 提交筛选条件,重置到第一页 onSubmitFilter(): void { this.loadItems(1); } // 分页切换时触发 pageChanged(event: any): void { this.loadItems(event.page); } }
4. HTML模板修改
添加日期选择器、筛选按钮,并保留分页组件:
<!-- 筛选区域 --> <div class="filter-bar mb-4"> <div class="row g-3"> <div class="col-md-4"> <label class="form-label">开始日期</label> <input type="text" class="form-control" bsDatepicker [(bsValue)]="startDate" [bsConfig]="bsConfig" placeholder="选择开始日期"> </div> <div class="col-md-4"> <label class="form-label">结束日期</label> <input type="text" class="form-control" bsDatepicker [(bsValue)]="endDate" [bsConfig]="bsConfig" placeholder="选择结束日期"> </div> <div class="col-md-4 align-self-end"> <button class="btn btn-primary w-100" (click)="onSubmitFilter()">筛选数据</button> </div> </div> </div> <!-- 数据列表 --> <table class="table table-hover"> <thead> <tr> <th>ID</th> <th>名称</th> <th>创建时间</th> <!-- 其他字段 --> </tr> </thead> <tbody> <tr *ngFor="let item of items"> <td>{{ item.id }}</td> <td>{{ item.name }}</td> <td>{{ item.createdAt | date:'YYYY-MM-DD HH:mm:ss' }}</td> <!-- 其他字段 --> </tr> </tbody> </table> <!-- 分页组件 --> <div class="d-flex justify-content-center mt-4"> <pagination [(ngModel)]="currentPage" [totalItems]="totalItems" [itemsPerPage]="pageSize" (pageChanged)="pageChanged($event)" [maxSize]="5" [boundaryLinks]="true" previousText="上一页" nextText="下一页" firstText="首页" lastText="末页"> </pagination> </div>
5. 模块依赖导入
确保在你的功能模块或根模块中导入所需依赖:
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { HttpClientModule } from '@angular/common/http'; import { BsDatepickerModule } from 'ngx-bootstrap/datepicker'; import { PaginationModule } from 'ngx-bootstrap/pagination'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; // 日期选择器必需 import { ItemListComponent } from './item-list.component'; @NgModule({ declarations: [ItemListComponent], imports: [ BrowserModule, HttpClientModule, BrowserAnimationsModule, BsDatepickerModule.forRoot(), PaginationModule.forRoot() ] }) export class ItemModule { }
内容的提问来源于stack exchange,提问作者Ayobamilaye
相关产品推荐
相关产品推荐

