2016-08-13 7 views
2

私のHTTPサービスから自分のコントローラにデータを送信しようとしています。サービスはデータを正しく取得しますが、コントローラに送信されません。サービスからコントローラにデータを正しく渡す方法

質問が非同期的に行われていることがわかりました。そのため、私は$ q.deferを使用しようとしています。 私は同様の質問で提供されている例に従ってみました:AngularJS $http call in a Service, return resolved data, not promises、それでも動作しません。ここで

は私のサービスです。

.service("builds", ['$http', '$q', function($http, $q) { 
    var deferred = $q.defer(); 

    $http({ 
     method:'GET', 
     url: '/builds', 
     cache : true 
    }).success(function(data) { 
     deferred.resolve(data); 
    }).error(function(msg){ 
     deferred.reject(msg); 
    }); 
    console.log(deferred.promise); 
    return deferred.promise;}]); 

そして、ここで私のrouteProvider

$routeProvider. 
    when('/builds', { 
     controller: ['$scope', 'buildsData', function ($scope, buildsData) { 
      console.log("In routeprovider:" + buildsData); 
      $scope.allBuilds = buildsData; 
     }], 
     template: '<build-list></build-list>', 
     resolve: { 
      buildsData: ['builds', function(builds){ 
       return builds; 
      }] 
     } 
    }) 

そして最後にここに私のコントローラの抜粋です:

var app = angular. 
module('buildList'). 
    component('buildList', { 
    templateUrl: 'build-list/build-list.template.html', 
    controller: function BuildListController($scope, $window,$location,$cookies, builds) { 
    console.log($scope.allBuilds); 
    $scope.league = $scope.allBuilds; 
+0

すべきコントローラでは、コントローラ

でこのメソッドを呼び出すべきであると言う関数を作成コントローラーからデータを取得します。そのロジックをカプセル化し、そのメソッドをctrlから呼び出すサービス内のメソッドを作成します。 –

答えて

2

as @vishalと言うとき

一般的に、サービスにはgetおよびsetメソッドが多数あることがあります(これはベストプラクティスを意味します)。

のgetData

function getData() 
{ 
    $http({ 
     method:'GET', 
     url: '/builds', 
     cache : true 
    }) 
} 

が、あなたは、あなたがサービスを呼び出す必要があり、このサービスを注入し、その後

builds.getData().then(function(s){ 
//result 

},function(e){ 

//error 
} 
); 
+0

ありがとう、私はあなたが言ったように動作するようになった。しかし、データが2回リクエストされる...ページがロードされるとすぐに(私のrouteProviderがgetBuilds()をトリガする)、そしてコントローラのgetBuilds()をコールする2回目にデータがリクエストされる。私はrouteProviderでgetBuilds()を呼び出さないでください。それはやるべき論理的なもののように思えましたが、私はそのデータをどこにでも使っていないようです... – Storm

+0

更新No2:これは長引いてしまいました。私は私のrouteProviderからreturn builds.getBuilds()を削除しました。今すぐウェブサイトが読み込まれ、2-3秒後にデータが入力されます。よく働く! – Storm

0

あなたは

を持っているshouldntt
controller: ['$scope', 'buildsData', function ($scope, buildsData) { 
      console.log("In routeprovider:" + buildsData); 
      $scope.allBuilds = buildsData; 
     }], 

やその他のファイルのコントローラ:あなたはそれにいくつかの機能を追加したい場合は、直接、

$scope.allBuilds = buildsData; 

の横にあなたのコントローラで、その後

when('/builds', { 
     controller: 'BuildListController' 
     template: '<build-list></build-list>', 
     resolve: { 
      buildsData: ['builds', function(builds){ 
       return builds; 
      }] 
     } 
    }) 

とを行うことができます

、あなたサービスは次のようになります。

.service("builds", ['$http', '$q', function($http, $q) { 

     var deferred = $q.defer(); 

    getbuilds: function(){ 
     $http({ 
      method:'GET', 
      url: '/builds', 
      cache : true 
     }).success(function(data) { 
      deferred.resolve(data); 
     }).error(function(msg){ 
      deferred.reject(msg); 
     }); 
     console.log(deferred.promise); 
     return deferred.promise;}]); 
    } 
+0

私は単に$ scope.allBuilds = buildsDataを持つと思った。コントローラでは十分ではありませんでした。 builds.getBuilds()を呼び出すことができますか?先に進む前にデータを受け取るのを待つ特別な関数が必要ですか? – Storm

+0

サービスは関数ではありませんが、関数のコレクションとして見ることができます。だからあなたは@サイヤンのようにそれを呼び出さなければならない – DMCISSOKHO

関連する問題