如何在Camunda表格中使用选择筛选?需基于Angular cam-sdk-form实现
嘿,我来帮你把这段jQuery的筛选逻辑完美迁移到Angular结合cam-sdk-form的环境里,咱们一步步拆解,尽量贴合Angular的最佳实践,同时兼容cam-sdk-form的特性:
迁移jQuery筛选逻辑到Angular + cam-sdk-form
核心思路说明
原来的jQuery逻辑是DOM驱动:监听select变化→操作DOM显示/隐藏表格→遍历DOM行筛选数据。Angular更推荐数据驱动:绑定数据到视图→通过数据变化触发筛选→自动更新视图和结果数组,这样更符合Angular的响应式编程理念,也能更好地和cam-sdk-form集成。
1. 模板(HTML)实现
替换jQuery依赖的原生DOM操作,改用Angular的双向绑定、事件绑定和结构指令:
<!-- 集成cam-sdk-form的表单容器 --> <div class="cam-form-container"> <!-- 用Angular表单控件绑定选择值,替代jQuery的change监听 --> <select id="mySelector" [(ngModel)]="selectedFilter" (change)="handleFilterChange()" class="cam-form-control"> <option value="">显示全部</option> <option value="active">仅激活文档</option> <option value="archived">仅归档文档</option> <!-- 替换为你实际的筛选选项值 --> </select> <!-- 用*ngIf控制表格显示/隐藏,*ngFor动态渲染行(推荐数据驱动) --> <table id="myTable" class="cam-table" *ngIf="selectedFilter || showAllTable"> <thead> <tr> <th>文档ID</th> <th>状态</th> <th>文档名称</th> </tr> </thead> <tbody> <tr *ngFor="let doc of allDocuments" [class.hidden]="!matchesFilter(doc)"> <td>{{doc.id}}</td> <td>{{doc.status}}</td> <td>{{doc.name}}</td> </tr> </tbody> </table> </div>
2. 组件类(TypeScript)实现
将jQuery的DOM遍历替换为Angular的数据筛选,同时集成cam-sdk-form的变量获取能力:
import { Component, OnInit } from '@angular/core'; import { CamForm } from 'camunda-angular-sdk'; // 根据cam-sdk-form实际导入路径调整 @Component({ selector: 'app-document-filter-form', templateUrl: './document-filter-form.component.html', styleUrls: ['./document-filter-form.component.css'] }) export class DocumentFilterFormComponent implements OnInit { selectedFilter: string = ''; showAllTable: boolean = true; allDocuments: any[] = []; // 存储从cam-sdk-form获取的原始文档数据 selectedDocuments: any[] = []; // 最终筛选后的结果数组 constructor(private camForm: CamForm) {} ngOnInit(): void { // 从cam-sdk-form加载流程变量中的文档数据(核心集成点) this.camForm.variableManager.fetchVariable('allDocuments').subscribe(vars => { this.allDocuments = vars['allDocuments'].value; this.updateSelectedDocuments(); // 初始化时默认选中全部 }); } handleFilterChange(): void { // 控制表格显示/隐藏逻辑 this.showAllTable = !this.selectedFilter; // 更新筛选后的文档数组 this.updateSelectedDocuments(); } // 自定义筛选规则:判断文档是否符合当前选中的筛选条件 matchesFilter(doc: any): boolean { if (!this.selectedFilter) return true; // 无筛选时显示全部 // 替换为你实际的筛选逻辑,比如根据文档状态匹配 return doc.status === this.selectedFilter; } // 更新选中的文档数组 updateSelectedDocuments(): void { this.selectedDocuments = this.allDocuments.filter(doc => this.matchesFilter(doc)); // 如果需要和cam-sdk-form的流程变量同步,可以在这里更新变量 // this.camForm.variableManager.setValue('selectedDocuments', this.selectedDocuments); } }
3. 进阶优化:响应式表单风格
如果你的项目用了Angular响应式表单,可以替换双向绑定为FormControl,更贴合Angular的响应式理念:
<!-- 模板中替换select为响应式表单控件 --> <select [formControl]="filterControl" class="cam-form-control"> <!-- 选项不变 --> </select>
// 组件类中添加响应式表单逻辑 import { FormControl } from '@angular/forms'; // ... filterControl = new FormControl(''); ngOnInit(): void { // 监听筛选值变化,自动触发更新 this.filterControl.valueChanges.subscribe(value => { this.selectedFilter = value; this.showAllTable = !value; this.updateSelectedDocuments(); }); // 加载cam-sdk-form数据逻辑不变 }
关键注意事项
- 避免直接操作DOM:Angular不推荐像jQuery那样遍历DOM元素,尽量用数据驱动的方式处理筛选和视图更新。
- cam-sdk-form集成:通过
CamForm服务可以直接获取/设置Camunda流程变量,让筛选结果和流程引擎同步。 - 兼容性:如果你的表格是静态DOM(非动态渲染),可以通过
ViewChild获取表格元素,但依然建议转为数据驱动模式,维护成本更低。
内容的提问来源于stack exchange,提问作者beginer beginer
相关产品推荐
相关产品推荐

