Quindi compilando la domanda precedente (Http request in service successful but not able to show in view). Ho bisogno di andare più in profondità nella mia richiesta http per effettuare una chiamata API per un film selezionato, in questo modo:L'approfondimento della mia richiesta http non mostrerà i dati necessari sulla vista
http.get('https://api.themoviedb.org/3/movie/'+ movieId + '?api_key=XXX')
codice completo del mio servizio:
angular.module('starter.services', [])
.service('HotMoviesService', function($http, $q){
var movieId;
var final_url = "https://api.themoviedb.org/3/movie/popular?api_key=XXX";
var self = {
'hotMovies' : [],
'singleHotMovie' : [],
'loadHotMovies' : function() {
var d = $q.defer();
$http.get(final_url)
.success(function success (data){
//console.log(data);
self.hotMovies = data.results;
for(var i = 0; i < self.hotMovies.length; i++){
//console.log(self.hotMovies[i].id);
movieId = self.hotMovies[i].id;
//console.log("Logging movie id: ", movieId);
$http.get('https://api.themoviedb.org/3/movie/'+ movieId + '?api_key=XXXXX')
.success(function succcess(response){
//console.log("Logging response in the for loop " , response);
self.singleHotMovie = response;
})
.error(function error (msg){
console.log(msg);
})
}
d.resolve('The promise has been fulfilled');
})
.error(function error (msg){
console.error("There was an error retrieving the data " , msg);
d.reject("The promise was not fulfilled");
});
return d.promise;
}
};
return self;
})
mio controller è il seguente:
.controller('StartCtrl', function($scope, $http, HotMoviesService) {
//POPULAR
$scope.hotmovies = [];
HotMoviesService.loadHotMovies().then(function success (data){
console.log(data);//returns success message saying that promise is fulfilled
$scope.hotmovies = HotMoviesService.singleHotMovie;
},
function error (data){
console.log(data)//returns error messag saying that promise is not fulfilled
});
})
codice HTML (lista di film)
<ion-view view-title="The Movie Bank">
<ion-content class="background">
<h1 class="padding titleStart">Welcome to The Movie Bank</h1>
<div class="logo"></div>
<!-- HOT -->
<a class="customHref" href="#/app/hot">
<h1 class="padding customH1">Hot</h1>
</a>
<hscroller>
<ion-scroll direction="x" scrollbar-x="false">
<hcard ng-repeat="hotmovie in hotmovies">
<a href="#/app/hot/{{hotmovie.id}}">
<img ng-src="http://image.tmdb.org/t/p/w92/{{hotmovie.poster_path}}" >
</a>
</hcard>
</ion-scroll>
</hscroller>
</ion-content>
</ion-view>
Quando si fa clic su uno dei film, dovrebbe andare alla pagina dei dettagli che viene eseguita (l'ID è mostrato nell'URL), ma non riesco a leggere i dati per quel film specifico. Anche se tutte le mie richieste sono ok e stanno arrivando nella mia console.
codice HTML per la pagina di dettagli:
<ion-view view-title="Hot Detail">
<ion-content >
<h1>test</h1>
<h4>{{original_title}}</h4>
<img ng-src="http://image.tmdb.org/t/p/w92/{{hotMovie.poster_path}}" >
</ion-content>
</ion-view>
Screenshot della pagina dei dettagli:
Che cosa sto facendo di sbagliato?
FWIW, '' Success' e error' sono deprecati. Ma non è solo un problema asincrono? Ad esempio, stai impostando un valore nel callback e provando a usarlo prima che finisca addirittura? –
@DaveNewton, non credo che sia un problema asincrono ... ma di nuovo non sicuro al 100%. piuttosto nuovo a tutto – GY22
Il tuo 'd.resolve ('La promessa è stata soddisfatta');' si trova alla fine della funzione _loadHotMovies_, non all'interno del callback _success_ di '$ http.get' del primo livello, che significa che tu può emettere "La promessa è stata soddisfatta" prima che sia completamente completata; piuttosto, il tuo $ q.deferred (_d_) sarà completato, ma non la chiamata $ _ http. –