我正在努力让$resource
服务按预期运行。我尝试按照documentation和tutorial进行操作,这似乎提供了一个完全有效的实现。但是使用这个我遇到了两个问题。
我的(非常基本的)实施:
$resource
- 服务:
app.factory('User', function ($resource) {
return $resource(
'myurl/user/:id',
{id: '@_id'},
{
update: {method: 'PUT'}
}
);
});
我如何在我的控制器中调用它:
$scope.user = User.get({id:$scope.myId});
//save a new user:
$scope.user.$save(function(){location.href = '#/mainpage';});
//delete a user
$scope.user.$delete({id:$scope.myId},function(){location.href = '#/mainpage';});
//update a user
$scope.user.$update({id: user.id}, function(){location.href = '#/mainpage';});
我的问题:
编辑:解答感谢Andre Kreienbring。为什么我必须为{id:$scope.myId}
服务指定身份$delete
?根据上面的链接,这应该自动完成。但是,如果我跳过这个,DELETE将转到myurl/user
而不是myurl/user/{myId}
。
GET返回一个promise,因此$scope.user
除了特定于用户的属性外,还包含属性$promise
和resolved
。如果我通过PUT将其发送到我的REST API,则请求被拒绝,因为后端无法将请求主体解析为User
- 对象。
无法识别的字段“$ promise”,未标记为可忽略
要解决此问题,我尝试在履行承诺时提取数据:
$scope.user = User.get({id:$scope.myId});
$scope.user.$promise.then(function(data){$scope.test = data});
上述代码中的$scope.test
仍包含属性$promise
和resolved
。如何将“干净”的JSON对象发送到不包含$promise
的REST API?
答案 0 :(得分:1)
关于你的第一个问题: 根据{{3}}:
如果参数值以@为前缀,则为该值的前缀 参数将从相应的属性中提取出来 数据对象(在调用操作方法时提供)
因此,当调用$scope.user.$delete({id:$scope.myId}
{id:$scope.myId}
是您的数据对象时。
您的paramDefaults选项{id: '@_id'}
使$ resource查找数据对象,其值为'id'=> $ scope.myId。我们假设这个值是'123'
然后,网址模板参数会被此值替换,并变为myurl/user/123
答案 1 :(得分:0)
您希望明确使用用户(不要大写)服务的方法:
app.factory('user', function ($resource) {
var User = $resource('myurl/user/:userId', {userId:'@id'});
return {
get: get
};
function get(id){
return User.get({ userId: id }).$promise;
}
});
用作:
user.get($scope.myId).then(function(user){
$scope.user = user;
});