Angular $resources 何时使用回调函数以及如何获取对象 "clean"
Angular $resources when to use callback functions and how to get the object "clean"
我在使用 $resources
时遇到了问题,我真的不明白什么时候可以简单地将变量分配给 $resource
响应 var user = Users.getCurrent()
或者什么时候我必须使用打回来。
我创建了一个 service
,它绑定到一个 resource
。
.factory('Users', function ($resource, gcAPICOACH) {
return $resource(gcAPICOACH + 'users/current',{},
{
'getCurrent': {method: 'GET' },
'save': {method: 'PUT'}
});
});
我有一项用于授权的服务
.factory('gcAuth', function ($rootScope, $log) {
var currentUser;
return {
login: function (user) {
currentUser = user;
$rootScope.$emit('notify', {type: 'info', title: gettext('Welcome'), text: user.name});
$rootScope.$broadcast('user.logged', user, $rootScope.next);
},
isLoggedIn: function () {
return !angular.isUndefined(currentUser);
},
currentUser: function () {
return currentUser;
}
};
});
现在我做了一个带有登录功能的简单登录控制器。 问题来了,我该用哪个?
$scope.login = function () {
//option 1
Users.getCurrent(function (user) {
$log.debug("inside");
gcAuth.login(user);
});
//option 2
gcAuth.login(Users.getCurrent());
};
和html调用函数:
<p><a class="btn btn-lg btn-success" ng-hide="user" ng-click="login()">Login!<span class="glyphicon glyphicon-ok"></span></a></p>
注意:我有设置用户令牌的拦截器,所以当我调用 currentUser
它实际上 returns 正确的对象
文档指出:
It is important to realize that invoking a $resource object method immediately returns an empty reference (object or array depending on isArray). Once the data is returned from the server the existing reference is populated with the actual data. This is a useful trick since usually the resource is assigned to a model which is then rendered by the view.
很明显渲染没有问题,但是在这种情况下 angular 的 "magic" 没有效果。我说得对吗?
PS:我遇到的另一个问题是 Users.getCurrent()
返回的对象也有 angular 函数,例如 $promise
和 co。我怎样才能取回 clean 对象?
你应该使用选项 1。$resource
方法总是异步的,所以它不会立即 return 一个对象,只有一个 reference 包含一个空占位符,在 ajax 调用加载后填充。
您可以使用angular.fromJson(angular.toJson(user))
获得一个干净的对象。相关回答问题:Strip or overwrite an AngularJS $resource
我在使用 $resources
时遇到了问题,我真的不明白什么时候可以简单地将变量分配给 $resource
响应 var user = Users.getCurrent()
或者什么时候我必须使用打回来。
我创建了一个 service
,它绑定到一个 resource
。
.factory('Users', function ($resource, gcAPICOACH) {
return $resource(gcAPICOACH + 'users/current',{},
{
'getCurrent': {method: 'GET' },
'save': {method: 'PUT'}
});
});
我有一项用于授权的服务
.factory('gcAuth', function ($rootScope, $log) {
var currentUser;
return {
login: function (user) {
currentUser = user;
$rootScope.$emit('notify', {type: 'info', title: gettext('Welcome'), text: user.name});
$rootScope.$broadcast('user.logged', user, $rootScope.next);
},
isLoggedIn: function () {
return !angular.isUndefined(currentUser);
},
currentUser: function () {
return currentUser;
}
};
});
现在我做了一个带有登录功能的简单登录控制器。 问题来了,我该用哪个?
$scope.login = function () {
//option 1
Users.getCurrent(function (user) {
$log.debug("inside");
gcAuth.login(user);
});
//option 2
gcAuth.login(Users.getCurrent());
};
和html调用函数:
<p><a class="btn btn-lg btn-success" ng-hide="user" ng-click="login()">Login!<span class="glyphicon glyphicon-ok"></span></a></p>
注意:我有设置用户令牌的拦截器,所以当我调用 currentUser
它实际上 returns 正确的对象
文档指出:
It is important to realize that invoking a $resource object method immediately returns an empty reference (object or array depending on isArray). Once the data is returned from the server the existing reference is populated with the actual data. This is a useful trick since usually the resource is assigned to a model which is then rendered by the view.
很明显渲染没有问题,但是在这种情况下 angular 的 "magic" 没有效果。我说得对吗?
PS:我遇到的另一个问题是 Users.getCurrent()
返回的对象也有 angular 函数,例如 $promise
和 co。我怎样才能取回 clean 对象?
你应该使用选项 1。$resource
方法总是异步的,所以它不会立即 return 一个对象,只有一个 reference 包含一个空占位符,在 ajax 调用加载后填充。
您可以使用angular.fromJson(angular.toJson(user))
获得一个干净的对象。相关回答问题:Strip or overwrite an AngularJS $resource