В ngTables запуск $scope.tableParams.reload() в третий раз приводит к ошибке TypeError: невозможно установить для свойства $data значение null

Эта ошибка связана с плагином ngTable для AngularJS.

Кажется, у меня действительно странная ошибка. По сути, я могу запустить $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();
    } 
}

person Adam    schedule 29.04.2014    source источник
comment
Код, который вы используете для получения данных (которые вы пометили как потенциально несвязанные), на самом деле не имеет значения; проблема заключается в вызове $scope.tableParams.reload(). Предложил редактирование, но оно было отклонено.   -  person Léo Lam    schedule 01.08.2014


Ответы (4)


Я знаю, что уже слишком поздно, но я подумал, что лучше прокомментировать это для других, которые ищут ответ на тот же вопрос.

У меня также была такая же проблема, и мне удалось ее исправить, следуя примеру в следующем URL-адресе.

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

Я только что добавил следующую строку кода в свой код после создания экземпляра ngTableParams.

$scope.params.settings().$scope = $scope;
person Hasitha Guruge    schedule 06.09.2014
comment
Это помогло мне избежать ошибки null, но содержимое таблицы по-прежнему не перезагружается. У меня есть перезагрузка в другом контроллере, отличном от того, в котором я создаю таблицу. - person LasagnaAndroid; 10.12.2014

Попробуйте добавить:

,
$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()));

            }
person bingorabbit    schedule 11.05.2014
comment
Это не сработает, так как ng-table ожидает настоящую $scope, а не фальшивую. - person Léo Lam; 01.08.2014
comment
Да, это помогает избежать ошибки, но не обновляет данные, что на самом деле упускает суть. - person LasagnaAndroid; 10.12.2014

У меня такая же проблема. Когда вы инициализируете ngTableParams, вам нужно указать все параметры: page, count, total и counts, даже если вы не используете пейджинг, потому что в противном случае свойство $scope настройки будет каким-то образом установлено равным нулю при объединении всех настроек вместе.

person Kostia Mololkin    schedule 03.10.2014

Я также столкнулся с той же проблемой и решил ее, добавив перезагрузку:

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