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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:05:57