当前位置: 首页 > 面试题库 >

ng-Table在重新加载请求时未呈现新数据

况安然
2023-03-14
问题内容

我有ng-table的页面,可以很好地处理初始数据。我有一个选择框,该框根据选择的选项发送服务器请求,然后Iam将新数据获取为angular,但未使用ng-
table更新。

这是我的看法:

<section data-ng-controller="ReportsController">
<div class="plain-box">
    <table ng-table="tableParams" show-filter="true" class="table table-striped">
        <thead>
        <tr>
            <th ng-repeat="column in columns" ng-show="column.visible"
                class="text-center sortable" ng-class="{
                    'sort-asc': tableParams.isSortBy(column.field, 'asc'),
                    'sort-desc': tableParams.isSortBy(column.field, 'desc')
                  }"
                ng-click="tableParams.sorting(column.field, tableParams.isSortBy(column.field, 'asc') ? 'desc' : 'asc')">
                {{column.title}}
            </th>
        </tr>
        </thead>
        <tbody>
        <tr ng-repeat="user in $data">
            <td ng-repeat="column in columns" sortable="column.field">
                {{user[column.field]}}
            </td>
        </tr>
        </tbody>
    </table>
</div>

我的控制器:

angular.module('reports').controller('ReportsController', ['$scope', '$stateParams', '$location', 'Authentication', 'Reports', '$filter', 'ngTableParams',
function($scope, $stateParams, $location, Authentication, Reports, $filter, ngTableParams ) {
    $scope.reportBillingPeriod = 0;
    $scope.$watch('reportBillingPeriod', function(newValue, oldValue) {
        $scope.findReportData( newValue );
    });
    //$scope.reportBillingData = 0;


    $scope.findReportData = function( selectedMonth ){
        var selectedPeriod = selectedMonth;
        if( selectedPeriod === null )
        selectedPeriod = '0';
        $scope.customers_report = Reports.customer_report({
        monthReport: selectedPeriod
        }, function( result ){
        var data = result.customers;
        $scope.columns = [
            { title: 'Account Name', field: 'accountName', visible: true, filter: { 'name': 'text' } },
            { title: 'Gross Revenue', field: 'planTotalAmount', visible: true }
        ];

   $scope.$watch('result', function () {
        $scope.tableParams.settings().$scope = $scope;
        $scope.tableParams.reload(); 
    });

        $scope.tableParams = new ngTableParams({
            page: 1,            // show first page
            count: 10,          // count per page
            filter: {
            name: 'O'       // initial filter
            }
        }, {
            total: data.length, // length of data
            getData: function($defer, params) {
            var orderedData = params.sorting() ? $filter('orderBy')(data, params.orderBy()) : data;
            $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
            //$scope.reportBillingData = new Date();
            }
        });
        });
    };
}]);

问题答案:

$scope.$watch(‘result’, function () {
$scope.tableParams.settings().$scope = $scope; <<–nested scope is replacing!!
$scope.tableParams.reload();
});

ngTable 指令会建立巢状范围,其中包含所有指令的设定才能运作,因此您不应该将它替换为ReportsController的范围,而 需要移除此列, $scope.tableParams.settings().$scope = $scope; 并且需要为 ngTable 指定所有参数,请在此处查看ngTables$scope.tableParams.reload()第三次导致TypeError:无法将属性’$data’设置为null-reload-for-the-third-time-results-in-t/26174211#26174211)

UPDATE 以及最好将ngTableParams初始化和$watch用作findReportData函数之外的结果,以防止错误和不必要的重新初始化

UPDATE 2
我设置了plunk,尝试使其看起来更像原始问题,并模拟httpservice,但这不是重要的是,所有数据访问都必须在getDatafunc
里面,ngTableParams并且在设置所有需要调用的过滤器时(或者可能只是$watch像在plunk中那样使用),您必须调用$scope.tableParams.reload();,您可以尝试在上面的输入中键入一些数字,数据将会更新没问题。为清晰起见,删除了与排序,固定和过滤相关的所有代码,因此getData如下所示:

 getData: function($defer, params) {
        var selectedPeriod = $scope.reportBillingPeriod ; //selectedMonth;
         if( selectedPeriod === null )
    selectedPeriod = '0';
    $scope.customers_report = Reports.get({   //Reports.customer_report({
    monthReport: selectedPeriod
    }, function(result ){
    var data = result.customers;
     $scope.tableParams.total(data.length);


    var orderedData = params.sorting() ? $filter('orderBy')(data, params.orderBy()) : data;
        $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));

    });

        }

并查看过滤器更改,如下所示:

 $scope.reportBillingPeriod = 0;
    $scope.$watch('reportBillingPeriod', function(newValue, oldValue) {
        $scope.tableParams.reload(); 
     });

UPDATE 3
删除了调用getDatafunc的重复项,在此进行
了修改,将问题放在$watchreportBillingPeriod变量中,因此,为了防止第二次上传数据,我们必须检查值的更改方式,例如此处

$scope.reportBillingPeriod = defaultValue;
    $scope.$watch('reportBillingPeriod', function(newValue, oldValue) {
        //this how we prevent second call
        if (newValue!=oldValue)
        $scope.tableParams.reload(); 
     });


 类似资料:
  • 我通过AJAX请求从数据库中获取表数据。我需要更改AJAX请求中的数据参数并刷新表。 我正在用命令刷新表格 我有以下代码 但是在AJAX重新加载之后,会向服务器发送原始请求,并忽略新的参数值。我试图通过函数、全局变量和浏览器存储将数据传递给请求,但这些方法都不起作用。在互联网上,我找到了解决问题的方法 功能,但我不知道如何使用它。 我的jQuery数据表版本是1.10.7。 我还尝试使用以下代码销

  • 问题内容: Ajax请求后如何刷新或重新加载div?我有此代码: 我需要重新加载或刷新标题div。 问题答案: 您可以这样加载div.div之前请注意空格

  • 我是新来的反应。作为一个学习练习,我正在构建一个国际象棋应用程序 我想根据父级中的状态更改子级的DOM。当前,在父级组件的状态变化时,子级组件没有变化。 PS:请忽略任何语法错误。这段代码是实际代码的精简。如果你想看完整的代码,请看这里

  • 问题内容: 我一直在看这些页面(1,2,3)。我基本上想更改自己的,但是我不想重新加载页面。 我目前在页面上,当我单击按钮并使URL变为时,我想进入编辑模式。 我的状态很简单,所以没有必要重新加载整个页面。但是,我确实希望and和or 进行更改,以便如果用户刷新页面,则页面将以编辑模式启动。 我能做什么? 问题答案: 对于此问题,您可以仅创建既不具有也不具有的子状态,并在正常情况下向前移动: 这里

  • 在基于多个用户上下文呈现整个页面并发出多个请求之后,我希望用户能够切换上下文并再次重新呈现所有内容(重新发送所有请求,等等)。如果我只是将用户重定向到其他地方,事情就会正常工作: 如果使用,则上等待响应的某些请求将被取消,因此我不能使用它。此外,黑客也不起作用(什么也不会发生)。 有没有另一种方法可以重新呈现页面,而不用再次手动发出所有请求?

  • 当用户单击Sales Overview选项卡时,我想发出axios请求,然后更新该选项卡中的各种图表。我能够发出axios请求,获取数据,甚至获得数据。然而,在第一次点击Sales Overview选项卡时,除了前面的仪表板组件数据(或者前面的任何选项卡),我看不到任何东西。但点击另一个随机选项卡,然后点击Sales Overview选项卡,我就可以看到我想要的数据了。这是一个越来越大的问题吗?