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

Angular中dx-file-uploader无法在dx-data-grid内正常工作的问题

在DevExtreme 21.2.5 Angular项目中集成dx-file-uploader到dx-data-grid

实现步骤

1. 将dx-file-uploader嵌入网格的编辑表单

你的网格使用form编辑模式,直接在dxo-editing内部添加dxo-form配置,把上传组件作为表单自定义项加入,这样上传组件会在新增/编辑弹窗中显示,和其他表单字段联动。

修改后的tab.component.html代码:

<div id="data-grid-demo">
  <dx-data-grid
    id="gridContainer"
    [dataSource]="dataSource"
    keyExpr="ID"
    [showBorders]="true"
    (onSaving)="onSaving($event)"
  >
    <dxo-paging [enabled]="false"></dxo-paging>
    <dxo-editing
      mode="form"
      [allowUpdating]="true"
      [allowAdding]="true"
      [allowDeleting]="true"
    >
      <!-- 自定义编辑表单,加入文件上传项 -->
      <dxo-form>
        <dxi-item itemType="group" [colCount]="2">
          <dxi-item dataField="Prefix" caption="Title" [width]="70"></dxi-item>
          <dxi-item dataField="FirstName"></dxi-item>
          <dxi-item dataField="LastName"></dxi-item>
          <dxi-item dataField="Position" [width]="170"></dxi-item>
          <dxi-item dataField="StateID" caption="State" [width]="125">
            <dxo-lookup [dataSource]="states" displayExpr="Name" valueExpr="ID"></dxo-lookup>
          </dxi-item>
          <dxi-item dataField="BirthDate" dataType="date"></dxi-item>
          <!-- 文件上传表单项 -->
          <dxi-item caption="Upload File" [colSpan]="2">
            <dx-file-uploader
              #fileUploader
              selectButtonText="Select File"
              labelText="No file selected"
              accept="*"
              uploadMode="instant"
              [uploadUrl]="uploadApiUrl"
              (onValueChanged)="onFileSelected($event)"
              (onUploaded)="onFileUploaded($event)"
            ></dx-file-uploader>
          </dxi-item>
          <dxi-item dataField="Notes" [colSpan]="2">
            <dxo-form-item editorType="dxTextArea" [editorOptions]="{ height: 100 }"></dxo-form-item>
          </dxi-item>
        </dxi-item>
      </dxo-form>
    </dxo-editing>

    <!-- 网格列配置保持不变 -->
    <dxi-column dataField="Prefix" caption="Title" [width]="70"></dxi-column>
    <dxi-column dataField="FirstName"></dxi-column>
    <dxi-column dataField="LastName"></dxi-column>
    <dxi-column dataField="Position" [width]="170"></dxi-column>
    <dxi-column dataField="StateID" caption="State" [width]="125">
      <dxo-lookup [dataSource]="states" displayExpr="Name" valueExpr="ID"></dxo-lookup>
    </dxi-column>
    <dxi-column dataField="BirthDate" dataType="date"></dxi-column>
    <dxi-column dataField="Notes" [visible]="false"></dxi-column>
  </dx-data-grid>
</div>

2. 完善TypeScript逻辑

在tab.component.ts中添加事件处理,管理文件选择、上传状态,并在保存数据时关联文件信息:

import { Component, ViewChild } from '@angular/core';
import { DxFileUploaderComponent } from 'devextreme-angular';
import { SaveEvent } from 'devextreme/ui/data_grid';

@Component({
  selector: 'app-tab',
  templateUrl: './tab.component.html',
  styleUrls: ['./tab.component.css']
})
export class TabComponent {
  dataSource: any[]; // 你的业务数据源
  states: any[]; // 状态选项数据源
  uploadApiUrl = 'https://your-actual-upload-api'; // 替换为后端上传接口地址
  @ViewChild('fileUploader') fileUploader: DxFileUploaderComponent;
  currentSelectedFile: any;

  // 文件选中事件
  onFileSelected(event: any) {
    this.currentSelectedFile = event.value[0]; // 暂存当前选中文件信息
  }

  // 文件上传完成事件
  onFileUploaded(event: any) {
    // 上传完成后可记录文件ID/路径,关联到当前编辑行数据
    console.log('文件上传完成:', event.file);
  }

  // 网格保存事件
  onSaving(event: SaveEvent) {
    const submitFormData = new FormData();
    // 追加选中的文件到表单
    if (this.currentSelectedFile) {
      submitFormData.append('file', this.currentSelectedFile);
    }
    // 追加表单其他字段数据
    submitFormData.append('formData', JSON.stringify(event.data));

    // 阻止网格默认保存行为,手动提交数据
    event.cancel = true;
    
    // 调用后端接口提交文件和表单数据
    fetch(this.uploadApiUrl, {
      method: 'POST',
      body: submitFormData
    }).then(response => {
      // 处理响应,比如刷新网格数据源
      // 示例:根据实际业务调整数据源更新逻辑
      this.dataSource = [...this.dataSource, event.data];
    }).catch(error => {
      console.error('上传失败:', error);
    });
  }
}

关键注意事项

  • 上传模式选择:useForm模式下DevExtreme表单不会自动携带上传文件,更推荐用instant模式即时上传,再将文件信息关联到业务数据。
  • 数据源同步:文件上传并提交业务数据后,需手动刷新网格数据源,或调用后端接口获取最新数据。
  • 版本兼容:上述代码适配DevExtreme 21.2.5版本的API规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:25:15