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

Angular Service传入对象未更新:删除数据后NgTable不刷新求助

我来帮你分析一下这个问题,其实核心原因是你的NgTableDataService在初始化NgTableParams时,闭包捕获了当时传入的tableData数组引用——如果后续你只是用splice修改原数组,理论上引用是同一个,应该能拿到最新数据,但可能NgTable的内部机制或代码逻辑导致它没有正确感知到数组内容的变化;而如果之后你重新赋值了$scope.alertsensorconfigs(比如从后台拉取新数组),那service里的闭包引用就完全是旧数组了。

下面是具体的解决方法,能确保每次表格加载都拿到最新的数据:

1. 修改NgTableDataService,改用函数获取最新数据

把service的getGenericTableParams方法改成接收一个获取数据的函数,而不是直接接收数组。这样每次NgTable需要数据时,都会调用这个函数拿到最新的数组:

angular.module('control-room').service('NgTableDataService', function ($filter, NgTableParams, Session) {
    var session = Session.get();
    this.getGenericTableParams = function(getTableData, funcFilter, searchTableFilter){
        return new NgTableParams({
            count: session.user.tablePagination,
            filter: searchTableFilter
        }, {
            counts: rowsPerPageTemplate,
            getData: function (params) {
                // 每次获取数据时,调用函数拿到最新的数组
                var tableData = getTableData();
                
                if (params.filter() == ''){
                    var pfilter = '';
                }else{
                    var pfilter = params.filter().filter.toUpperCase();
                }
                let filteredData = params.filter() ? $filter('filter')(tableData, funcFilter(pfilter)) : tableData;
                
                if (!!filteredData && filteredData.length >= 0) {
                    params.total(filteredData.length);
                    var rowsPerPageTemplateWithAllData = rowsPerPageTemplate.slice();
                    var isFound = rowsPerPageTemplateWithAllData.some(function (element) {
                        return element === filteredData.length;
                    });
                    params.settings().counts = rowsPerPageTemplateWithAllData.filter(item=>item<filteredData.length)
                    if (filteredData.length >= 5){
                        params.settings().counts.push(filteredData.length);
                    }
                    rowsPerPageTemplateWithAllData.push(filteredData.length + (isFound ? 1 : 0));
                    if (session.user.tablePagination >= params.settings().counts[params.settings().counts.length-1]){
                        params.settings().count = params.settings().counts[params.settings().counts.length-1];
                    }else{
                        params.settings().count = session.user.tablePagination;
                    }
                    if (params.total() <= params.count()) {
                        params.page(1);
                    }
                    var x = $filter('orderBy')(filteredData, params.orderBy());
                    var y = x.slice((params.page() - 1) * params.count(), params.page() * params.count());
                    return y;
                } else {
                    params.settings().counts = [];
                    return null;
                }
            }
        });
    };
});

2. 页面代码传入数据获取函数

在页面中,不再直接传入$scope.alertsensorconfigs数组,而是传入一个返回该数组的函数:

$scope.tableParams = NgTableDataService.getGenericTableParams(
    () => $scope.alertsensorconfigs, // 用函数返回最新数组
    $scope.funcFilter, 
    $scope.searchTable.filter
)

这样修改后,每次NgTable调用getData刷新数据时,都会通过这个函数拿到最新的$scope.alertsensorconfigs,不管你是用splice修改原数组,还是直接重新赋值新数组,service都能获取到最新的数据,完美解决删除后表格不更新的问题。

你的删除逻辑本身是没问题的:删除后端数据后修改本地数组,再调用tableParams.reload()触发刷新,修改上述代码后这个流程就能正确同步数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:08:36