可以't从一个角度内更新全局变量.forEach循环
Can't update a global variable from within an angular.forEach loop
在尝试从Angular.forEach循环中修改全局变量时,我似乎陷入了困境。
我可以很好地修改变量,但当在循环之外访问时,似乎无法将更改应用于变量。
我尝试了各种各样的"var self=this",并在整个循环中使用"this.addres=[]"来访问数组,但这也导致了同样的问题。当我到达我的"return"语句时,我的更改已经丢失。
这是代码:
$scope.getLocation = function(val) {
var geocoderRequest = {
address: String(val),
componentRestrictions: {
'country': 'US'
}
};
var addresses = [1]; // **** shows addresses as [1] *****
geocoder.geocode(geocoderRequest, function(callbackResult) {
console.log('address in geocode: ' + addresses); // ***** shows addresses as [1] ****
var f = '';
angular.forEach(callbackResult.results, function(item) {
console.log('address in angular: ' + addresses); // **** shows addresses as [1] *****
if (item.types[0] == 'locality') {
for (f = 1; f < item.address_components.length; f++) {
if (item.address_components[f].types[0] ==
"administrative_area_level_1") {
addresses.push(item.address_components[0].short_name + ', ' + item.address_components[
f].short_name);
console.log('addresses in each: ' + addresses); // **** shows addresses as [1, 2, 3] after I 'push' 2 and 3 into addresses array ****
break;
}
}
}
});
});
console.log('addresses outside: ' + addresses); // ***** shows addresses as [1] even after pushing 2 and 3 *****
return addresses;
};
最终的解决方案是使用Angular的$q返回一个promise:
在控制器中:
.controller('LaunchformController',
['$scope', '$q', 'geocoder', function ($scope, $q, geocoder) {
$scope.getLocation = function(val) {
var deferred = $q.defer();
geocoder.geocode({ address: String(val), componentRestrictions: {'country':'US'} },
function(callbackResult) {
deferred.resolve(callbackResult);
});
return deferred.promise;
};
}])
在服务中:
.service('geocoder',function() {
this.geocode=function(georequest, outerCallback) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode( georequest, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var f = '';
var addresses = [];
angular.forEach(results, function(item){
if (item.types[0] == 'locality') {
for (f=1;f<item.address_components.length;f++) {
if (item.address_components[f].types[0] == "administrative_area_level_1") {
addresses.push(item.address_components[0].short_name + ', ' + item.address_components[f].short_name);
break;
}
}
}
});
outerCallback(addresses);
} else {
outerCallback({success:false, err: new Error('Geocode was not successful for the following reason: ' + status), results: null});
}
});
};
})
相关文章:
- 使用mongodb更新中的一个变量
- 通过单击动态加载的表中同一行的另一个字段来更新一行的字段
- React应用程序:道具在下一个事件后更新
- 在scala或scalajs Diode中,现有类型中的任何一种都符合“;更新一个没有'还不存在”;
- 向更新mysql查询传递一个id
- 当我更新另一个作用域变量时,作用域变量会自动更新
- Meteor.js只更新一个参数,而不是整个集合
- 多个进度条可视地只更新一个进度条
- 将字符串转换为数组使用javascript更新一个值并返回一个字符串
- 查找与锁定和更新调度相关的一个或两个节点模块
- 在一个控制器中更新服务变量,并在另一个控制器 - Angular JS中使用更新的值
- 从另一个页面更新 JavaScript 变量的值
- 下一个/上一个锚链接,如何在用户滚动时更新下一个/上一个链接
- Angular,设置一个回调函数,用于在工厂和控制器之间更新
- 如何在 JavaScript 中获取下一个元素和更新
- 从knockout.js中的另一个对象更新一个深度结构化的javascript对象
- 如何在nodejs/mongodb上创建一个更新函数
- Rails仅对一个更新请求进行多次更新
- 为所有值创建一个更新按钮
- 当在另一个更新面板上使用__doPostBack时,停止更新