0

我的脚本有问题,该脚本部分地从数据库中收集数据。我想在下载数据完成时通知 Angular,所以我使用了 $watch。不幸的是,它不起作用。Angular 在开始时调用函数,而不是在更改 loadingComplete 值之后。

angular
.module('app')
.controller('tlmController', function($scope, $http) {
    var vm              = this;
    var data            = [];
    vm.countTestLines   = 0;
    vm.loadingComplete  = false;

    $scope.$watch('vm.loadingComplete', function() {
        console.log(data);
    });     

    $http({
        method: 'GET',
        url: 'app/server/tt/count_testlines.php'
    }).then(function successCallback(response) {
        vm.countTestLines = parseInt(response.data.count);

        downloadInParts(data, 0, vm.countTestLines);

    }, function errorCallback(response) {
        console.log('error');
    });

    var downloadInParts = function(data, offset, max) {         
        if(max < offset) { 
            vm.loadingComplete = true;
            return;
        }

        $http({
            method: 'GET',
            url: 'app/server/tt/get_testlines.php',
            params: { offset: offset }
        }).then(function successCallback(response) {
            data = data.concat(response.data);          
            downloadInParts(data, offset + 5, max);
        }, function errorCallback(response) {
            console.log('error');
        });


    }

});
4

3 回答 3

0

由于您使用的是 'vm' 而不是 '$scope',因此有必要在函数中插入 $scope.$apply。

if(max < offset) { 
     vm.loadingComplete = true;
     $scope.$apply();
     return;
  }

$scope 总是监视值的变化,如果有任何变化,Angular 将在内部调用 $digest() 函数并且变化的值将被更新。使用 'vm' 不会更新导致问题的值。

于 2016-12-01T10:12:03.137 回答
0

如果您正在使用var vm = this,根据JohnPapa 的AngularJS 样式指南,这是正确的方法,您应该将 $watch 重写为:

$scope.$watch(function(){ return vm.loadingComplete }, function() {
    console.log(data);
});

评论更新: 您的函数参数从您的控制器中data隐藏了您的变量。data

于 2016-12-01T09:34:14.593 回答
0

问题是它loadingComplete不是范围的一部分。您应该将其声明为$scope.loadingComplete;.

于 2016-12-01T09:24:33.620 回答