![](/img/trans.png)
[英]Unit Testing Angular.js with $httpBackend and $scope.$watch
[英]Javascript Closure Within a For Loop (2 closures involved - an $http.get call and a $scope.$watch) using angular.js
我正在使用angular-google-maps创建一个角度应用程序。 我想要做的是循环遍历一系列位置,以便在每个位置的纬度和经度上放置一个标记。 但是,因为我在for循环中使用了几个闭包,所以标记只出现在数组的最后一个条目中。 这是代码:
$scope.petMarkers = [];
$http.get('/api/pets').success(function(foundPets){
$scope.foundPets = foundPets;
var listOfPets = $scope.foundPets;
var markerCreator = function(arrayOfPets){
for (var i = 0; i < arrayOfPets.length; i++){
var singlePet = arrayOfPets[i];
var petName = arrayOfPets[i].name;
var identity = singlePet._id;
var location = singlePet.addressFound;
var split = location.split(' ');
var joined = split.join('+');
var httpAddress = 'http://maps.google.com/maps/api/geocode/json?address=' + joined + '&sensor=false';
// anonymous function keeps reference to i, and when console.log is called, for loop has already finished and value of i is set to 4
$http.get(httpAddress).success(function(mapDataAgain){
var ladder = mapDataAgain.results[0].geometry.location.lat;
var longer = mapDataAgain.results[0].geometry.location.lng;
var obj = {
latitude: ladder,
longitude: longer,
title: petName,
id: i
};
$scope.$watch(function(){
console.log('we are in scope.watch');
return $scope.map.bounds;
}, function(){
var markers = [];
//markers.push(obj);
$scope.petMarkers.push(obj);
//$scope.petMarkers = markers;
console.log('markers = ', $scope.petMarkers);
}, true);
});
};
};
markerCreator(listOfPets);
});
关于如何使用此代码立即调用函数表达式(IIFE)的任何想法? 我无法弄清楚我是否需要两个IIFE(一个用于匿名函数调用$ http调用成功,一个用于匿名函数调用$ scope作为参数。$ watch)。 我有点迷失在这里,所以任何解释/帮助/建议都会有所帮助。
你不需要for循环,你当然不需要IIFE。 您有一系列结果,因此只需调用本机.forEach
函数即可。 它需要一个可以在数组中的所有元素上执行的回调。 这种方法的好处:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.