You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于MEAN栈的Bootstrap表格按列值是否为空实现行过滤需求

嘿,刚好我之前做过类似的MEAN栈表格过滤需求,给你一套完整的实现方案,分前端轻量过滤和后端大数据过滤两个方向,你可以根据自己的数据量来选:

前端(Angular + Bootstrap)轻量实现(小数据量推荐)

如果你的表格数据量不大,直接在前端过滤更高效,不用折腾后端。

1. 组件逻辑(.ts文件)

首先在你的Angular组件里定义原始数据、过滤后的数据,还有过滤方法:

import { Component } from '@angular/core';

@Component({
  selector: 'app-table-filter',
  templateUrl: './table-filter.component.html',
  styleUrls: ['./table-filter.component.css']
})
export class TableFilterComponent {
  // 原始表格数据,假设结构是 { col1: string, col2?: string }
  originalTableData = [
    { col1: '用户A', col2: '已映射角色1' },
    { col1: '用户B' }, // 第二列无值
    { col1: '用户C', col2: '已映射角色2' },
    { col1: '用户D' }
  ];
  filteredTableData: typeof this.originalTableData = [...this.originalTableData];
  selectedFilter = 'All'; // 默认显示全部

  // 下拉框切换时触发的过滤方法
  onFilterChange() {
    switch(this.selectedFilter) {
      case 'Mapped':
        // 只保留第二列有非空值的行
        this.filteredTableData = this.originalTableData.filter(item => 
          item.col2 !== undefined && item.col2.trim() !== ''
        );
        break;
      case 'UnMapped':
        // 只保留第二列无值或为空的行
        this.filteredTableData = this.originalTableData.filter(item => 
          !item.col2 || item.col2.trim() === ''
        );
        break;
      default: // All选项
        this.filteredTableData = [...this.originalTableData];
    }
  }
}

2. 模板(.html文件)

把下拉框和表格绑定起来,用ngModel绑定选中值,change事件触发过滤:

<!-- 下拉过滤器 -->
<div class="mb-3">
  <select 
    class="selectpicker form-control" 
    [(ngModel)]="selectedFilter" 
    (change)="onFilterChange()"
  >
    <option value="All">All</option>
    <option value="Mapped">Mapped</option>
    <option value="UnMapped">UnMapped</option>
  </select>
</div>

<!-- Bootstrap表格 -->
<table class="table table-hover table-striped">
  <thead class="table-dark">
    <tr>
      <th>第一列(必选数据)</th>
      <th>第二列(可选数据)</th>
    </tr>
  </thead>
  <tbody>
    <tr *ngFor="let row of filteredTableData">
      <td>{{ row.col1 }}</td>
      <td>{{ row.col2 || '未映射' }}</td> <!-- 无值时显示友好占位符 -->
    </tr>
  </tbody>
</table>

3. 必做配置

别忘了在你的Angular模块里导入FormsModule,不然ngModel用不了:

import { FormsModule } from '@angular/forms';

@NgModule({
  imports: [
    // 其他模块(比如BrowserModule)
    FormsModule
  ]
})
export class YourModule { }

如果你的数据是从后端异步获取的,记得在数据加载完成后初始化过滤数据:

// 假设你有一个数据服务
this.dataService.getTableData().subscribe(data => {
  this.originalTableData = data;
  this.filteredTableData = [...data];
});

后端(Node.js + Express + MongoDB)实现(大数据量推荐)

如果你的表格数据上千上万条,前端过滤会卡顿,那就把过滤逻辑放到后端,通过接口参数返回对应数据:

1. Express路由处理

// 假设用Mongoose操作MongoDB
const express = require('express');
const router = express.Router();
const YourModel = require('../models/yourModel');

router.get('/table-data', async (req, res) => {
  const filterType = req.query.filter || 'All';
  let query = {};

  switch(filterType) {
    case 'Mapped':
      // 查询第二列存在且非空的文档
      query.col2 = { $exists: true, $ne: '', $ne: null };
      break;
    case 'UnMapped':
      // 查询第二列不存在或为空的文档
      query.$or = [
        { col2: { $exists: false } },
        { col2: { $in: ['', null] } }
      ];
      break;
    // All的话query为空,返回所有数据
  }

  try {
    const tableData = await YourModel.find(query);
    res.status(200).json(tableData);
  } catch(err) {
    res.status(500).json({ message: '获取数据失败', error: err });
  }
});

module.exports = router;

2. 前端调用接口

修改Angular组件的过滤方法,换成调用后端接口:

onFilterChange() {
  this.dataService.getFilteredTableData(this.selectedFilter).subscribe(data => {
    this.filteredTableData = data;
  });
}

然后在你的数据服务里定义接口方法:

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';

@Injectable({ providedIn: 'root' })
export class DataService {
  constructor(private http: HttpClient) {}

  getFilteredTableData(filter: string = 'All') {
    return this.http.get(`/api/table-data?filter=${filter}`);
  }
}

这样就搞定啦,小数据用前端过滤,大数据用后端过滤,根据自己的场景选就行😎

内容的提问来源于stack exchange,提问作者techie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:26:17