Angularjs 我们可以将$http注入到Angular服务中并将数据传递给控制器吗?

Angularjs 我们可以将$http注入到Angular服务中并将数据传递给控制器吗?,angularjs,json,http,angular-services,angular-controller,Angularjs,Json,Http,Angular Services,Angular Controller,我正在尝试使用AngularJS中的服务从外部文件加载JSON数据 myApp.service('ContactsListService', function($http) { var contactsList = $http.get('js/contacts.json').success(function(data){ return data; }); console.log(contactsList); // prints some $http object

我正在尝试使用AngularJS中的服务从外部文件加载JSON数据

myApp.service('ContactsListService', function($http) {
    var contactsList = $http.get('js/contacts.json').success(function(data){
    return data;
    });
    console.log(contactsList); // prints some $http object 
    return {
    'contactsList': contactsList;
    };
}

myApp.controller('ContactDisplayController',['$scope','ContactsListService',function($scope, ContactsListService){
$scope.contacts = ContactsListService.contactsList;
console.log(ContactsListService.contactsList); // prints 'undefined' here
}]);

**JSON file:**

        [
          {
            name: 'Steph Curry',
            mobile: '111111111'
          },
          {
           name: 'Lebron James',
           mobile: '2323232323'
         }
     ]
我想使用控制器中服务的数据,我无法传递该数据。如果我以错误的方式注入服务,请更正我


谢谢

您存储的是$http承诺,而不是来自该ajax调用的响应。更好的方法是让服务定义一个返回承诺的方法,让您的控制器获得该承诺并使用结果

myApp.service('ContactsListService',函数($http){ this.getContactsList=函数(){ 返回$http.get('js/contacts.json'); }; }); myApp.controller('ContactDisplayController',['$scope','ContactsListService',函数($scope,ContactsListService){ ContactsListService.getContactsList()成功(函数(数据){ $scope.contacts=数据; }); }]);
谢谢你的回答Joey,我已经用你的方式尝试过了,我无法在成功功能之外打印数据:

myApp.controller('ContactDisplayController',['$scope','ContactsListService',function($scope, ContactsListService){
  ContactsListService.getContactsList().success(function(data) {
    $scope.contacts = data;
   console.log($scope.contacts); // prints data here.
  });
console.log($scope.contacts); // prints undefined here.
}]);

只需要知道这是如何流动的。获取数据,然后对其进行处理,就在处理数据的过程中

myApp.controller('ContactDisplayController',['$scope','ContactsListService',function($scope, ContactsListService){
     $scope.contacts = [];  //initialize it
      ContactsListService.getContactsList().success(function(data) {
        $scope.contacts = data;
         //now do stuff with it
      });
     //console logging here happens before your async call returns
    }]);

谢谢你的回答Joey,我已经用你的方式尝试了,我无法打印成功函数以外的数据:
myApp.controller('ContactDisplayController',['scope','ContactsListService',function($scope,ContactsListService){ContactsListService.getContactsList().success(函数(数据){$scope.contacts=data;console.log($scope.contacts);//在此处打印数据。});console.log($scope.contacts);//在此处打印未定义的数据。}]);
这是因为第二个console.log在ajax请求返回结果之前执行。此时未定义联系人是正确的。对您的答案使用注释/编辑,而不是发布问题的答案。您的
console.log
在您使用异步ajax获取数据之前执行谢谢克雷本,@Joey Ciechanowicz的解释和回答。完全明白了。