2016-11-15 4 views
0

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; 
     } 

    } 

}); 
+0

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

+0

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? –

+0

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

Antwort

1

ich eine der Fabrik Funktionen geändert - getStories auf eine Ebene http.get und jetzt scheint es zu funktionieren. Ich habe meinen eigenen Versprechenscode - $ q library - losgeworden und einfach das Versprechen benutzt, dass die http-Anfrage für den getCats-Aufruf zurückkommt. Ich musste die Fabrik wechseln, um es anders zu nennen.

Ich änderte nichts in der Steuerung und jetzt ist mein Versprechen für beide zurückgegeben. Ich denke, dass nur eine Art von Versprechen zu einer einzigen Ansicht zurückkehren kann?

Verwandte Themen