У меня есть простая фабрика, ниже которой запрашивается объект json с некоторой информацией о местоположении. Запросы работают, я вижу, что данные находятся в объекте. Но почему-то проблема с прицелом. Я не могу получить доступ к свойствам объекта location, даже если я знаю, что у объекта есть свойство и правильный массив.
Вы можете увидеть в фрагменте кода ниже (если вы посмотрите на комментарии), что я не могу получить доступ к некоторому значению объекта при попытке вывести его на консоль.
Любая идея о том, что может быть проблемой?
.factory('Spots', function(){
return{
all: function($resource){
var locations;
var Locations = $resource('http://localhost\\:3000/locationsd/');
locations = Locations.get(function(){
console.log(locations.results[0].obj.name); // THIS WORKS -> gives me the name of the location
});
console.log(locations); // THIS WORKS -> log an object with a result array, etc.
console.log(locations.results[0].obj.name); // THIS DOESNT WORK -> TypeError: Cannot read property '0' of undefined
return locations;
}
}
})
Это связано с тем, что он является асинхронным. Чтобы правильно использовать $ resource в сервисе, вы должны использовать обещания.
.factory('Spots', function(){
return{
all: function($resource){
var Locations = $resource('http://localhost\\:3000/locationsd/');
return Locations.get().$promise.then(function(res){
return res;
});
}
}
})
Затем при вызове функции с вашего контроллера:
Spots.all().then(function(res){
//do stuff with res here
})
Если вы не знаете, какие обещания, читайте о них здесь: https://docs.angularjs.org/api/ng/service/ $ q
Общая идея - это ресурс, обещающий, что он закончится в конце концов, и когда это будет сделано, он вызовет функцию, которую вы передадите в ее then()
.