Ich baue eine einfache Nachrichten App.ionische App Versprechen funktioniert nur in der ersten Ansicht
Es hat zwei Ansichten.
Einer ist die Liste der Geschichten, und der andere ist die Liste der Kategorien. Jeder hat eine http.jsonp
Anfrage.
Das Problem ist, nur der erste geladene Controller der Ansicht wird eine Zusage erhalten. Wenn ich zum Beispiel die Story-Listenansicht zuerst lade (in anderen Worten, lade die Seite #home in meinem Browser), kommt die http.jsonp-Anfrage in Ordnung und ich sehe meine Warnung "zurück von den Geschichten versprechen". Wenn ich dann auf die Tab-Schaltfläche klicke, um zur Kategorieansicht zu wechseln, sehe ich meine http.jsonp-Anfrage und die Daten zurück, so dass der Controller ang getCats() aufgerufen werden muss, aber es gibt nicht das Versprechen - ich sehe nie die Warnung "zurück von getCats versprechen". Wenn ich den exakt gleichen Code verwende, aber zuerst die Kategorieansicht im Browser lade, dann werden die Kategorien gut gefüllt, aber wenn ich zur Story-Ansicht wechsle, wird die Verheißung nicht zurückgegeben. Es scheint also damit zu tun zu haben, zur zweiten Ansicht innerhalb der App zu wechseln.
Wie kann ich die zweite Ansicht erhalten, um das Versprechen zurückzugeben?
app.controller('listCtrl', ['$q','$scope','$state', 'StoriesFact',
function($q, $scope, $state, StoriesFact){
StoriesFact.getStories($scope).then(function(response){
alert("back from stories promise");
$scope.stories = response;
});
}]);
app.controller('sectionCtrl', ['$scope', 'StoriesFact',
function($scope, StoriesFact){
StoriesFact.getCats().then(function(response){
alert("back from getCats promise");
$scope.categories = response;
});
}]);
Und hier ist mein Werk mit den tatsächlichen http Anrufe:
angular.module('reader.StoriesFact', [])
.factory('StoriesFact', function($http, $q, $state) {
return {
getCats: function() {
var q = $q.defer();
jsonURL = 'http://www.bendbulletin.com/somejson?callback=JSON_CALLBACK&pub=BendBulletin';
$http.jsonp(jsonURL)
.success(function(data) {
q.resolve(data.categories);
});
return q.promise;
},
getStories: function() {
var q = $q.defer();
jsonURL2 = 'http://www.bendbulletin.com/somejson?callback=JSON_CALLBACK&cats=1829480:1829507:1829469';
$http.jsonp(jsonURL2)
.success(function(data) {
q.resolve(data.stories);
});
return q.promise;
}
}
});
Sie können $ ionicView.enter in dieser Situation verwenden. (Dieses Ereignis wird ausgelöst, egal ob es die erste oder eine zwischengespeicherte Ansicht war.) – Hosar
Also, nicht wirklich eine Antwort genau, aber ich ging eine andere Route. Ich habe aufgehört, jsonp zu verwenden, und verwende nur ein einfaches $ http.get. Dies bringt das Versprechen zurück. Habe ich ein bisschen mehr gelesen und herausgefunden, dass Apps nicht mit Cors-Problemen umgehen müssen? Also bin ich okay mit dem Get. Ist das wahr? –
In einem Ajax-Ruf muss man immer mit Cors umgehen. XmlHttpRequest unterscheidet sich von HttpRequest. Im ersteren Fall ist cors mindestens so notwendig, wie ich weiß. – Hosar