在ngTables中,第三次运行$ scope.tableParams.reload()会导致TypeError:无法设置属性' $ data'为null

时间:2014-04-29 20:45:06

标签: javascript angularjs ngtable

此错误与AngularJS的ngTable插件有关。

我似乎有一个非常奇怪的错误。基本上,我可以毫无问题地运行$scope.tableParams.reload()两次,但是在第三次执行时,以及随后的每次执行时,我都会收到以下错误:

TypeError: Cannot set property '$data' of null at [removed]/ng-table.js:411:55

我相信这是所有相关的代码,但如果遗漏了任何内容,请告诉我:

$scope.lookupAddress = function(address){       
    var url = 'https://blockchain.info/multiaddr?cors=true&active='+address;
    $scope.loading = true;
    $scope.clearTableData();
    $http.get(url).success(function(data){
        $scope.loading = false;
        $scope.loaded = true;
        $scope.loadError = false;
        glob = data;

        //I believe the next few for loops, and the assignment of transactions, is not relevant to finding the code.  That being said, I've included it because bugs hide where you least expect it.
        for (i = data.txs.length -1; i > -1; i-- ){
            var inputAddr = []; 
            for (z = 0; z < data.txs[i]['inputs'].length; z++){
                inputAddr.push(data.txs[i]['inputs'][z]['prev_out']['addr'])
            }
            var outputAddr = [];
            for (z = 0; z < data.txs[i]['out'].length; z++){
                outputAddr.push(data.txs[i]['out'][z]['addr'])
            }
            transactions[i] = {
                'Hash' : data.txs[i]['hash'],
                'Amount' : data.txs[i]['result'] / 100000000,
                'Balance' : data.txs[i]['balance'] / 100000000,
                'InputAddress' : inputAddr,
                'OutputAddress' : outputAddr,
                'Date' : timeConverter(data.txs[i]['time'])
            };
        };

        //You can also ignore this too... probably.
        $scope.output = {
            'BTC' : data.wallet.final_balance / 100000000, //Response in satoshi, so have to divide.
            'Address' : address,
            'Total Received': data.addresses[0].total_received / 100000000,
            'Total Sent': data.addresses[0].total_sent / 100000000,
            'Transactions' : transactions
        };
        //Enables new data to be loaded, e.g. on a new address.
        if ($scope.tableParams){
            $scope.tableParams.reload();
        } 
        data = transactions;
        $scope.tableParams = new ngTableParams({
            page: 1,            
            count: 5,           // items per page
            sorting: {
                Date: 'desc' 
            }
        }, {
            total: transactions.length, 
            getData: function($defer, params) {
                data = transactions;
                var orderedData = params.sorting() ? $filter('orderBy')(data, params.orderBy()) : data;
                $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));

            }
        });
    }).
    error(function(data){
        $scope.loadError = true;
    });
}

$scope.clearTableData = function(){
    transactions = [];
    $scope.output = {}
    if ($scope.tableParams){
            $scope.tableParams.reload();
    } 
}

4 个答案:

答案 0 :(得分:6)

我知道这已经太晚了,但我想更好地为那些寻求同一问题答案的人发表评论。

我也有同样的问题,并通过以下网址中的示例设法修复。

https://github.com/esvit/ng-table/blob/master/src/scripts/04-controller.js

我刚刚在&amp; ngTableParams&#39;之后将以下代码行添加到我的代码中实例创建。

$scope.params.settings().$scope = $scope;

答案 1 :(得分:0)

尝试添加:

,
$scope: { $data: {} }

后:

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

            }

答案 2 :(得分:0)

我遇到了同样的问题。初始化ngTableParams时,您需要指定所有参数:pagecounttotalcounts,即使您没有使用分页,因为否则,在将所有设置合并在一起时,设置的$scope属性将以某种方式设置为null。

答案 3 :(得分:0)

我也面临同样的问题并通过添加重新加载来解决它:

$scope.tableParams as below 
$scope.tableParams = new ngTableParams({
            page: 1,
            count: 25,
            ***reload: $scope.tableParams***
        },