我想拥有一个从我的数据库中返回用户的工厂。
我这样定义工厂:
angular.module('myapp')
.factory('UserFactory', function ($http, $q, $cookieStore, AuthTokenFactory) {
function profile () {
var deferred = $q.defer();
$http.get('/getprofile')
.sucess(function (data, status, headers, config) {
deferred.resolve(data);
})
.error(function (data, status, headers, config) {
deferred.reject(data);
});
console.log('something');
return deferred.promise;
};
var user = {
profile: profile
};
return user;
但是,稍后当我尝试访问用户对象的属性时,在这样的控制器中:
$scope.user = UserFactory;
我尝试访问user.name
(由我的数据库返回)我得到TypeError: undefined is not a function
这是为什么?或者,如何使用我的服务中的数据设置Factory的属性?
答案 0 :(得分:1)
' getprofile'方法是异步的,它返回一个promise。您需要使用promise API分配用户:
UserFactory.profile().then(function(response) {
$scope.user = reponse.data;
});
此外,您不需要$ q,因为$ http()已经返回了一个承诺:
function profile () {
return $http.get('/getprofile');
}
答案 1 :(得分:0)
我愿意:
angular.module('myapp')
.factory('UserFactory', function ($http, $cookieStore, AuthTokenFactory) {
var request;
var user = {};
user.ctrl = function(callback) {
request = $http.get('/getprofile')
.sucess(function (data, status, headers, config) {
user.name = data.name;
// etc
return callback(user)
})
.error(function (data, status, headers, config) {
// handle your error
});
return request
};
user.isReady = function() { (!request) ? true : false };
return user;
};
然后你可以调用ctrl来创建'用户和使用isReady函数确保完成http调用或使用回调函数。