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

Angular中ag-grid的setRowData无法加载数据至网格的问题

解决AngularJS中ag-grid调用setRowData时API未定义的问题

嘿,我来帮你搞定这个ag-grid加载数据的问题!你遇到的api未定义错误,本质是ag-grid还没完成初始化,你就着急调用setRowData了——用setTimeout虽然可能蒙对,但真的不是靠谱的解决办法,谁知道网格初始化要花多久呢?下面给你两个更稳妥的方案:

方法1:用ag-grid自带的onGridReady回调(最推荐)

ag-grid专门提供了onGridReady事件,等网格完全初始化好、API可以正常调用的时候,它会自动触发这个回调。这时候再调用setRowData,绝对不会报错。

修改你的代码如下:

HTML部分

<html>
<head>
    <!-- 别忘了引入ag-grid的CSS和JS文件,不然网格没法正常渲染 -->
    <link rel="stylesheet" href="ag-grid.css">
    <link rel="stylesheet" href="ag-theme-fresh.css">
    <script src="angular.js"></script>
    <script src="ag-grid-angular.min.js"></script>
</head>
<body ng-app="myApp" ng-controller="CustController as custCtrl">
    <div ag-grid="custCtrl.gridOptions" id="myGrid" style="height: 115px;width:500px;" class="ag-fresh"></div>
</body>
</html>

JS部分

var app = angular.module('myApp', ['agGrid']);

app.controller('CustController', function() {
    var vm = this;

    // 先定义好你的列配置,根据实际数据调整
    vm.gridOptions = {
        columnDefs: [
            { headerName: "列名1", field: "col1" },
            { headerName: "列名2", field: "col2" }
        ],
        // 网格就绪时自动触发这个函数
        onGridReady: function(params) {
            // 先把API存起来,以后想操作网格都能用
            vm.gridApi = params.api;
            // 现在可以放心加载数据啦
            var rowData = [
                { col1: "测试数据1", col2: "内容A" },
                { col1: "测试数据2", col2: "内容B" }
            ];
            vm.gridApi.setRowData(rowData);
        }
    };

    // 如果你的数据是从后端接口异步获取的,也可以这么写
    /*
    $http.get('/你的接口地址').then(function(response) {
        // 确保API已经初始化完成再调用
        if(vm.gridApi) {
            vm.gridApi.setRowData(response.data);
        }
    });
    */
});

方法2:先存数据,等API就绪再加载(适合异步数据场景)

如果你的数据是通过接口请求获取的,可能数据先回来了,但网格还没初始化好。这时候可以先把数据存起来,等网格就绪后再加载:

app.controller('CustController', function($http) {
    var vm = this;
    var savedRowData = null; // 用来临时存数据

    vm.gridOptions = {
        columnDefs: [/* 你的列配置 */],
        onGridReady: function(params) {
            vm.gridApi = params.api;
            // 如果数据已经提前拿到了,直接加载
            if(savedRowData) {
                vm.gridApi.setRowData(savedRowData);
            }
        }
    };

    // 异步请求数据
    $http.get('/你的接口地址').then(function(response) {
        savedRowData = response.data;
        // 如果API已经就绪,直接加载数据
        if(vm.gridApi) {
            vm.gridApi.setRowData(savedRowData);
        }
    });
});

为啥不推荐用setTimeout?

  • 你根本没法精准控制超时时间,设短了还是会报错,设长了用户要白等半天。
  • 代码很脆弱,换个性能差点的设备就可能失效,完全依赖运气可不行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:19:22