我的脚本有问题,它从部分数据库中收集数据。我想在下载数据完成后告知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');
});
}
});
答案 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'不会更新导致问题的值。