角度控制器无法从服务中获取数据

时间:2014-03-03 18:08:17

标签: angularjs angularjs-service angularjs-controller

背景:我正在学习AngularJS,我编写了示例代码来为模块创建服务,并将数据从服务传递到模块的一个控制器中,一切正常。

但是昨天当我试图将以下服务的数据传递给控制器​​时,它只是显示数据是未定义的,我不知道为什么。

var notif = angular.module('testnotif',[]);

notif.service('sharedUsers', ['$http', function($http){
  var url = current_dir+'/testNotif/getAllUsersjson';
  var allUsers = [];  
  var getAll = function (){
    $http.get(url)
    .success(function(data, status) {        
      data.forEach(function(user){
        allUsers[user['ys_user_id']]=user;
      });

      console.log('in service'); 
      console.log(allUsers);//here console shows allUsers data correctly fetched from server. 

      return allUsers;
      });
    };

   return {
       getAll: getAll
   };
}]);

notif.controller('notifCtrl',['$scope','$http', '$timeout','sharedUsers', 
                              function($scope, $http, $timeout,sharedUsers ){

    $scope.allUsers=sharedUsers.getAll(); //shareUsers.getAll() returns nothing
    console.log('in notifCtrl');
    console.log($scope.allUsers); //console just prints 'undefined'. what goes wrong?
}]);

该服务具有getAll属性,该属性是获取allUsers数据的函数。 在控制台中,它显示allUsers已经填充了来自服务器的数据, 但是在控制器中,当我调用这个getAll()函数时,它什么都不返回。 我的代码有什么问题? 非常感谢你!

编辑:现在我得到了正确的数据,感谢@doodeec指出'return'错误,并建议使用promise api。并且感谢@ IntegrityFirst指出了注入常量的更好方法。以下代码是工作版本,以防万一有人想知道。

//define constant:
notif.value('current_dir', 'dir to current path');
//in module, define service
notif.service('sharedUsers', ['$http','$q','current_dir', function($http, $q, current_dir){
var url = current_dir+'/testNotif/getAllUsersjson';
var allUsers = [];  

var getAll = function (){
    var deferred = $q.defer();
    $http.get(url)
    .success(function(data, status) {        
        data.forEach(function(user){
            allUsers[user['ys_user_id']]=user;
        });
        console.log('in service'); 
        console.log(allUsers);
        deferred.resolve(allUsers);         
    });
    return deferred.promise;
};
return {
     getAll: getAll
};
}]);
//in controller
notif.controller('notifCtrl',['$scope','$http', '$timeout','sharedUsers','$q', 
                              function($scope, $http, $timeout,sharedUsers,$q ){
sharedUsers.getAll().then(function(data){$scope.allUsers=data;});
}]);

1 个答案:

答案 0 :(得分:3)

getAll是不返回任何内容的函数,这就是$scope.allUsers未定义的原因

您可能想要这样做

控制器 - 代码将等待,同时从getAll返回的承诺得到解决,并将该承诺返回的数据分配给范围变量

sharedUsers.getAll().then(function(data) { $scope.allUsers = data; });

服务 - $http.get会返回承诺,因此您可以在方法调用中返回它,这样您就可以对控制器中的resolve/reject作出反应

var getAll = function (){
    return $http.get(url)
        .success(function(data, status) {        
            data.forEach(function(user){
                allUsers[user['ys_user_id']]=user;
            });    
            return allUsers;
        });
};