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

Kendo Grid工具栏模板dataItem传递undefined的原因及可行方案

Kendo Grid工具栏模板dataItem为undefined问题解析

问题现象

在Kendo Grid的单元格模板中使用let-dataItem能正常获取行数据,但在工具栏模板里同样声明let-dataItem并传递给点击函数时,控制台打印的dataItem却是undefined。

原因分析

Kendo Grid的不同模板上下文完全不同:

  • kendoGridCellTemplate是行级渲染模板,Grid在渲染每一行时,会自动将当前行的数据绑定到模板的dataItem变量上,所以let-dataItem能直接拿到当前行实体。
  • kendoGridToolbarTemplate是全局工具栏模板,它属于Grid的全局上下文,并不绑定任何单个行的数据——你在模板里声明的let-dataItem没有被Grid赋值,自然会是undefined。

解决方案

如果要实现点击工具栏按钮获取选中行数据的需求,不能用当前的方式,必须借助Grid的选择相关功能,有两种常用实现方式:

方式1:通过Grid模板引用直接获取选中项

修改HTML代码,给Grid添加模板引用变量,点击时直接通过API获取选中数据:

<kendo-grid #grid [data]="gridData" [selectable]="true">
    <kendo-grid-column field="date" title="Date">
      <ng-template kendoGridCellTemplate let-dataItem>
        {{dataItem.date| date: 'dd-MM-yyyy HH:mm'}}
      </ng-template>
    </kendo-grid-column>
    
    <ng-template kendoGridToolbarTemplate [position]="'bottom'">
        <button class="downloadButton" (click)="onClick($event, grid.selectedDataItems)" kendoButton>Download</button>
    </ng-template>  
</kendo-grid>

组件代码修改:

public onClick(e: Event, selectedItems: Project[]): void {
    e.preventDefault();
    console.log(e);
    console.log(selectedItems); // 获取到所有选中的行数据
}

方式2:通过选择事件维护选中项

给Grid绑定selectionChange事件,实时维护选中行的变量,点击时直接使用该变量:

<kendo-grid [data]="gridData" [selectable]="true" (selectionChange)="onSelectionChange($event)">
    <kendo-grid-column field="date" title="Date">
      <ng-template kendoGridCellTemplate let-dataItem>
        {{dataItem.date| date: 'dd-MM-yyyy HH:mm'}}
      </ng-template>
    </kendo-grid-column>
    
    <ng-template kendoGridToolbarTemplate [position]="'bottom'">
        <button class="downloadButton" (click)="onClick($event)" kendoButton>Download</button>
    </ng-template>  
</kendo-grid>

组件代码修改:

selectedItems: Project[] = [];

// 监听选择变化,更新选中项
onSelectionChange(event: SelectionEvent) {
  this.selectedItems = event.selectedItems;
}

public onClick(e: Event): void {
    e.preventDefault();
    console.log(e);
    console.log(this.selectedItems); // 使用维护的选中项变量
}

总结

工具栏模板不存在行级dataItem上下文,无法直接通过let-dataItem获取行数据,必须通过Grid的选择API或selectionChange事件来获取选中的行数据。

内容的提问来源于stack exchange,提问作者B.Quaink

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:12:01