$ scope。$ watch不会收听AngularJS 1.6

时间:2016-12-01 09:12:37

标签: javascript angularjs angularjs-1.6

我的脚本有问题,它从部分数据库中收集数据。我想在下载数据完成后告知Angular,所以我使用了$ watch。不幸的是,它不起作用。角度调用在开始时起作用,而不是在更改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');
        });


    }

});

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果您正在使用var vm = this,这是根据JohnPapa's styleguide对AngularJS的正确方法,您应该将$ watch重写为:

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

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

答案 2 :(得分:0)

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

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

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