使用$ resource service

时间:2015-10-08 13:14:49

标签: javascript json angularjs rest

我正在努力让$resource服务按预期运行。我尝试按照documentationtutorial进行操作,这似乎提供了一个完全有效的实现。但是使用这个我遇到了两个问题。

我的(非常基本的)实施:

$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';});

我的问题:

  1. 编辑:解答感谢Andre Kreienbring。为什么我必须为{id:$scope.myId}服务指定身份$delete?根据上面的链接,这应该自动完成。但是,如果我跳过这个,DELETE将转到myurl/user而不是myurl/user/{myId}

  2. GET返回一个promise,因此$scope.user除了特定于用户的属性外,还包含属性$promiseresolved。如果我通过PUT将其发送到我的REST API,则请求被拒绝,因为后端无法将请求主体解析为User - 对象。

      

    无法识别的字段“$ promise”,未标记为可忽略

  3. 要解决此问题,我尝试在履行承诺时提取数据:

    $scope.user = User.get({id:$scope.myId});
    $scope.user.$promise.then(function(data){$scope.test = data});
    

    上述代码中的$scope.test仍包含属性$promiseresolved。如何将“干净”的JSON对象发送到不包含$promise的REST API?

2 个答案:

答案 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;
});