背景:我正在学习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;});
}]);
答案 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;
});
};