我的脚本有问题,该脚本从零件中收集数据库。我想在下载数据完成时通知Angular,因此我使用了$ Watch。不幸的是,它行不通。Angular呼叫在开始时而不是在更改加载compleplete值之后函数。
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');
});
}
});
问题是loadingComplete
不是范围的一部分。您应该将其声明为$scope.loadingComplete;
。
由于您使用的是'vm'而不是'$ scope',因此有必要插入$ scope。$应用在您的功能中。
if(max < offset) {
vm.loadingComplete = true;
$scope.$apply();
return;
}
$范围总是监视价值变化,如果有的话,Angular会在内部调用$ digest()函数,并且更改的值将被更新。使用" VM"不会更新导致问题的值。
如果您使用的是var vm = this
,这是根据Johnpapa的tyleguide for Angularjs的正确方法,则应将$ Watch重写为:
$scope.$watch(function(){ return vm.loadingComplete }, function() {
console.log(data);
});
从注释中更新:您的功能参数data
从控制器中隐藏您的data
变量。