Angularjs 角度:是否使用$http中的数据设置工厂?(不能在工厂对象中使用$http.get吗?)
我希望有一个从我的数据库返回用户的工厂 我是这样定义工厂的:Angularjs 角度:是否使用$http中的数据设置工厂?(不能在工厂对象中使用$http.get吗?),angularjs,Angularjs,我希望有一个从我的数据库返回用户的工厂 我是这样定义工厂的: angular.module('myapp') .factory('UserFactory', function ($http, $q, $cookieStore, AuthTokenFactory) { function profile () { var deferred = $q.defer(); $http.get('/getprofile') .sucess(functio
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不是一个函数
为什么会这样?或者,如何使用服务中的数据设置工厂属性?getprofile方法是异步的,它返回一个承诺。您需要使用promise API分配用户:
UserFactory.profile().then(function(response) {
$scope.user = reponse.data;
});
另外,您不需要$q,因为$http()已经返回了一个承诺:
function profile () {
return $http.get('/getprofile');
}
我会:
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调用完成,或者使用回调函数。您在哪里分配
用户
的名称
属性?我所能看到的是,您正在为用户分配一个profile
属性,这是一个函数。您似乎没有执行该函数,但即使执行了,它也没有为用户
对象分配任何新属性……我喜欢这个想法,但通过将isReady函数放在视图中,他可以处理(如果他想在加载时显示某个元素)?对于加载ui框,我不会将其放在就绪函数中。我将为此创建一个指令。或者使用$httpInterceptorYes是的,这是它,它可以工作。但是有两个问题:如果我想更改用户信息,(比如从声明了UserFactory.profile()
的控制器,我该怎么做。换句话说,我能读写UserFactory.profile()吗.name
属性?如何同步它,以便在控制器中执行某些操作时,实际更新控制器中的属性和实际服务器上的属性?是的,您可以写入$Scope上的用户对象谢谢。还有一个(相关)问题。您提到不需要$q
。我在网上找到了这个模式,但它能更简洁地完成(不使用$q
)吗?