2016-04-20 14 views
1

私はangeljsでnewbyです。私はインターネットで研究しましたが、私の問題に適した解決策を見つけることができませんでした。私はコントローラからいくつかのデータを取得するためにhttp呼び出しを行った。コントローラ側は大丈夫です。しかし、クライアント側の約束はデータを待っていません。ここに私が書いたコード。MVCとAngularjs:約束はデータを待っていません

//service code 
angular.module("myApp").service('$myService', function ($http, $q) { 
      this.getDataArray = function() { 
       var deferred = $q.defer(); 
       $http.get('../Home/GetDataArray') 
        .success(function success(response) { 
         deferred.resolve(response); 
        }) 
        .error(function() { 
         console.log("error getting data array"); 
         deferred.reject(); 
        }); 

       return deferred.promise; 
      }; 
    } 

// controller-code 
angular.module("myApp").controller('dataController', function ($scope, $http, $myService) { 

     $scope.getDataFromService = function() { 
      $myService.getDataArray().then(function (response) { 
        $scope.dataArray = response.data; 
       }); 
     }; 
    }); 
} 

私は最初の$ scope.dataArrayでgetDataFromServiceメソッドを呼び出す空ですが、2回目の呼び出し、$ scope.dataArrayは、データで満たされています。問題はどこだ?助けてくれてありがとう。

+0

fiddler/chrome開発ツールで最初のHTTP呼び出しの結果を確認できますか? – fikkatra

+0

私もそれをチェックしましたが、私が最初に呼び出したときに、$ scope.dataArrayは空です。私が言ったように約束が待たずに –

+0

私は$ scope.dataを意味するわけではありません。最初の呼び出し(Chrome開発ツールに見られるような)の応答にデータが含まれていることは確かですか? – fikkatra

答えて

0

自分自身の角度の専門家ではありません。これは、私が同じ問題に遭遇したときのやり方です。

コントローラー:

angular.module("myApp").controller('dataController',[ '$scope', 'Service1', '$http', function ($scope, Service1, $http) { 
    var deferred = Service1.getDataArray().$promise; 
      return deferred.then(function successCallback(data, status, headers, config) { 
       // this callback will be called asynchronously 
       // when the response is available 
       $scope.dataArray = response.data; 
      }, function errorCallback(response) { 
       // called asynchronously if an error occurs 
       // or server returns response with an error status. 
      }) 
    }]) 

とサービス:

var service = angular.module("myApp").service('myService', ['ngResource']); 
    myService.factory('Service1', ['$resource', 
    function ($resource) { 
     return $resource('../Home/GetDataArray', {}, { 
      get: { method: 'GET', isArray: true }, 
     }); 
    }]) 

アイデアは、あなたのサービスが帰りを待つべきではないということです、あなたのコントローラがあり、これを試してみてください。だからあなたはあなたのサービスではなくあなたのコントローラの約束を待つべきです。私の例では、工場を使用しています。なぜなら、私は自分のプロジェクトでこの問題を回避しているからです。工場を使用したくない場合は、これを直接実行することができます。

+0

おかげでこのアプローチが私の問題を解決します。 –

関連する問題