这是我的控制者:
app.controller("PlaceController", ['$http', function($http){
this.places = shops;
var hotels = this;
hotels.objects = [];
this.spots = new Array;
this.newPlace = {};
this.city = new String();
this.addPlace = function() {
this.places.push(this.newPlace);
this.newPlace = {};
var request = *some query syntax, sorry for hiding*
$http.get(request).success(function(data) {
hotels.objects = data;
console.log(hotels.objects.elements);
});
for (each in hotels.objects.elements) {
this.spots.push(each.tags.name);
};
console.log(this.spots);
}}] );
当我将this.spots
登录到控制台时,我得到一个空数组。 http请求等完美地工作,因为console.log(hotels.objects.elements)
语句完美无缺。
由于这个问题,我也无法将其输出到我的HTML中。我该怎么办?
答案 0 :(得分:3)
您正在发出异步请求以获取这些位置,但您在完成之前就已记录它们。
将this.addPlace
更改为对promise回调中的spot数组进行记录/操作:
this.addPlace = function() {
this.places.push(this.newPlace);
this.newPlace = {};
var request = *some query syntax, sorry for hiding*
$http.get(request).success(function(data) {
hotels.objects = data;
console.log(hotels.objects.elements);
for (each in hotels.objects.elements) {
this.spots.push(each.tags.name);
};
console.log(this.spots);
});
答案 1 :(得分:1)
您在ajax请求完成之前添加到spots
数组,移动您的调用以在回调内推送:
$http.get(request).success(function(data) {
hotels.objects = data;
console.log(hotels.objects.elements);
angular.forEach(hotels.objects.elements, function(value) {
hotels.spots.push(value.tags.name);
});
});
此外,您应该使用$scope
而不是this
的引用。这样可以简化您的代码,而无需将this
重命名为hotels
使用$scope
app.controller("PlaceController", ['$scope', '$http', function($scope, $http){
$scope.places = shops;
$scope.objects = [];
$scope.spots = new Array;
$scope.newPlace = {};
$scope.city = new String();
$scope.addPlace = function() {
$scope.places.push($scope.newPlace);
$scope.newPlace = {};
var request = *some query syntax, sorry for hiding*
$http.get(request).success(function(data) {
$scope.objects = data;
console.log($scope.objects.elements);
angular.forEach($scope.objects.elements, function(value, key) {
$scope.spots.push(value.tags.name);
});
// spots is ready, log it, do whatever
console.log($scope.spots);
});
}}] );
注意:使用$scope
表示您不需要从html调用this
来引用控制器中定义的对象和函数。
一个例子:
<div ng-controller="PlaceController">
<!-- no need to call places.city, if you use $scope just write city -->
{{city}}
</div>
编辑:您可能不应该使用JavaScript的for-in
,问题在于它会对名称或索引进行迭代你的对象/数组。
一个例子:
var someArray = ['a', 'b', 'c'];
for (i in someArray) {
console.log(i); // prints 0, 1, 2
console.log(someArray[i]); // prints 'a', 'b', 'c'
}
这与其他流行语言中的任何for-in / for-each实现不同。
无论如何,在这种情况下,我编辑了上面的代码以使用Angular的forEach
,这是一个更合适的解决方案(许多库实现自定义 - 每个函数来修复JS&#39 ;奇怪for-in
)
您可以在Angular's docs
另一个选项,在普通javascript 中,如果$scope.objects.elements
是一个数组,则使用map()
function,如下所示:
$scope.spots = $scope.objects.elements.map(function(value) {
return value.tags.name; // value is an item in object.elements
});
答案 2 :(得分:0)
试试这个..
由于您的异步调用,您需要在成功中执行任务
$http.get(request).success(function(data) {
hotels.objects = data;
console.log(hotels.objects.elements);
for (each in hotels.objects.elements) {
hotels.spots.push(each.tags.name);
};
console.log(this.spots);
});