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

Angular环境下DevExpress DataGrid单元格按钮点击如何弹出自定义弹窗?

Angular 9+ DevExpress DataGrid 审批操作列实现方案

1. 模块依赖导入

首先确保项目已安装适配Angular 9+的devextreme、devextreme-angular依赖,在所属功能模块的module.ts中导入所需组件:

import { NgModule } from '@angular/core';
import { DxDataGridModule, DxPopupModule, DxButtonModule } from 'devextreme-angular';

@NgModule({
  imports: [
    // 其他已有导入
    DxDataGridModule,
    DxPopupModule,
    DxButtonModule
  ]
})
export class YourFeatureModule { }

2. 组件模板代码(*.component.html)

DataGrid新增操作列,同时复用同一个弹窗实现两种操作的确认逻辑:

<!-- DataGrid 组件 -->
<dx-data-grid [dataSource]="yourDataSource">
  <!-- 其他已有列配置 -->
  <dxi-column type="buttons" caption="操作" [width]="180">
    <dxi-button 
      text="Approve" 
      icon="check" 
      (onClick)="openConfirmPopup('approve', $event.row.data)"
    ></dxi-button>
    <dxi-button 
      text="Reject" 
      icon="close" 
      (onClick)="openConfirmPopup('reject', $event.row.data)"
    ></dxi-button>
  </dxi-column>
</dx-data-grid>

<!-- 通用确认弹窗 -->
<dx-popup
  [(visible)]="popupVisible"
  [showTitle]="true"
  title="操作确认"
  [width]="400"
  [height]="200"
  [dragEnabled]="false"
  [closeOnOutsideClick]="true"
>
  <div *dxTemplate="let data of 'content'">
    <p>{{confirmText}}</p>
  </div>
  <div *dxTemplate="let data of 'toolbarItems'">
    <dxi-toolbar-item toolbar="bottom" location="after">
      <dx-button text="No" (onClick)="onCancel()"></dx-button>
    </dxi-toolbar-item>
    <dxi-toolbar-item toolbar="bottom" location="after">
      <dx-button text="Yes" type="default" (onClick)="onConfirm()"></dx-button>
    </dxi-toolbar-item>
  </div>
</dx-popup>

3. 组件业务逻辑(*.component.ts)

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

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html'
})
export class YourComponent {
  // 表格数据源,替换为你自己的业务数据源
  yourDataSource: any[] = [];
  // 弹窗控制变量
  popupVisible = false;
  // 弹窗提示文本
  confirmText = '';
  // 当前操作类型
  currentAction: 'approve' | 'reject' | null = null;
  // 当前操作的行数据
  currentRowData: any = null;

  // 打开确认弹窗
  openConfirmPopup(action: 'approve' | 'reject', rowData: any) {
    this.currentAction = action;
    this.currentRowData = rowData;
    // 根据操作类型设置对应提示语
    this.confirmText = action === 'approve' 
      ? 'Are you sure you want to approve' 
      : 'Are you sure you want to reject';
    this.popupVisible = true;
  }

  // 点击弹窗Yes按钮触发
  onConfirm() {
    // 关闭弹窗
    this.popupVisible = false;
    // 根据操作类型执行对应自定义逻辑
    if (this.currentAction === 'approve') {
      this.handleApprove(this.currentRowData);
    } else if (this.currentAction === 'reject') {
      this.handleReject(this.currentRowData);
    }
    // 重置状态
    this.resetPopupState();
  }

  // 点击弹窗No按钮/关闭弹窗触发
  onCancel() {
    this.popupVisible = false;
    this.resetPopupState();
  }

  // 自定义Approve逻辑,替换为你自己的业务逻辑
  private handleApprove(rowData: any) {
    console.log('执行批准逻辑', rowData);
    // 示例:调用审批接口、刷新表格等
  }

  // 自定义Reject逻辑,替换为你自己的业务逻辑
  private handleReject(rowData: any) {
    console.log('执行驳回逻辑', rowData);
    // 示例:调用驳回接口、刷新表格等
  }

  // 重置弹窗状态
  private resetPopupState() {
    this.currentAction = null;
    this.currentRowData = null;
    this.confirmText = '';
  }
}

4. 实现说明

  • 操作列采用DevExpress DataGrid原生的按钮列类型实现,无需自定义cellTemplate,性能更优
  • 两个操作复用同一个弹窗,通过操作类型变量区分执行逻辑,减少冗余代码
  • 按钮点击事件可通过$event.row.data直接获取当前行的完整数据,无需额外查询
  • 如果需要自定义按钮样式,可给dxi-button添加cssClass属性自定义样式即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:18:03