2016-11-15 10 views
0

私は簡単なニュースアプリを構築しています。イオンアプリの約束は最初のビューでのみ機能します

2つのビューがあります。

1つはストーリーのリストで、もう1つはカテゴリのリストです。それぞれにhttp.jsonpリクエストがあります。

問題は、ロードされた最初のビューのコントローラだけが返される約束を得ることです。たとえば、ストーリーリストビューを最初にロードすると(他のページではブラウザ内にページをロードしています)、http.jsonpリクエストが正常に送信され、私の "back to stories promise"アラートが表示されます。次に、タブボタンをクリックしてカテゴリビューに切り替えると、http.jsonpリクエストとデータが返されるので、コントローラのgetCats()を呼び出す必要がありますが、約束は返されません。 「getCatsから約束する」警告が表示されます。まったく同じコードを使用していますが、ブラウザでカテゴリビューを最初に読み込むと、最初にカテゴリが設定されますが、私がストーリービューに切り替えると、再びその約束が返されません。だから、それはアプリ内の2番目のビューに切り替えることに関連しているようです。

約束を返すために2番目のビューを取得するにはどうすればよいですか?

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


}]); 

そしてここで、実際のHTTP呼び出しと私の工場で:

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

この場合、$ ionicView.enterを使用することができます。 – Hosar

+0

これは実際には正確な答えではありませんが、私は別のルートを訪れました。このイベントは、最初のロードであってもキャッシュされたビューであっても起動します。私はjsonpの使用をやめ、単純な$ http.getを使っています。これは約束を返す。もう少し読んで、私はアプリがCorsの問題に対処する必要がないことを知りましたか?だから私はゲットを使っても大丈夫です。本当? –

+0

Ajaxコールでは、常にCorsに対処する必要があります。 XmlHttpRequestはHttpRequestとは異なります。前者のケースでは、少なくとも私が知っているようにコルは再募集されています。 – Hosar

答えて

1

私は工場出荷時の機能の一つに変更 - 平野http.getにgetStoriesを、今では動作するようです。私は自分の約束コードである$ qライブラリを取り除き、httpリクエストがgetCats呼び出しのために返すという約束を使用しました。私は工場を変えなければならなかった。

return { 
     getCats: function() { 
      jsonURL = 'http://www.bendbulletin.com/somejson?callback=JSON_CALLBACK&pub=BendBulletin'; 

      return $http.jsonp(jsonURL).then(function(response){ 
       return response.data; 
      }); 

     }, 
     getStories: function() { 
      jsonURL = 'http://www.bendbulletin.com/somejson?callback=JSON_CALLBACK&pub=BendBulletin'; 

      return $http.get(jsonURL).then(function(response){ 
       appCats = response.data; 
       return response.data; 
      }); 

コントローラーで何も変更されていないため、私は両方のために私の約束が返されます。 1つのタイプの約束だけが単一のビューに戻ることができると思っていますか?

関連する問題