【问题标题】:Access REST API with $resource service使用 $resource 服务访问 REST API
【发布时间】:2015-10-08 13:14:49
【问题描述】:

我正在努力让$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 解决。 为什么我必须为 $delete 服务指定 ID {id:$scope.myId}?根据上面的链接,这应该自动完成。但是,如果我跳过这个,DELETE 会转到 myurl/user 而不是 myurl/user/{myId}

  2. GET 返回一个承诺,因此$scope.user 包含属性$promiseresolved 以及用户特定的属性。如果我通过 PUT 将其发送到我的 REST API,请求将被拒绝,因为后端无法将请求正文解析为 User-Object。

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

为了解决这个问题,我尝试在承诺实现时提取数据:

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

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

【问题讨论】:

    标签: javascript json angularjs rest


    【解决方案1】:

    关于您的第一个问题: 根据documentation of $resource

    如果参数值以 @ 为前缀,则为该值 参数将从上的相应属性中提取 数据对象(调用动作方法时提供)

    所以,当调用$scope.user.$delete({id:$scope.myId} {id:$scope.myId} 是你的数据对象。

    您的 paramDefaults 选项 {id: '@_id'} 使 $resource 在数据对象中查找 'id' => $scope.myId 的值。假设这个值为'123'

    然后URL模板参数被这个值替换,变成myurl/user/123

    【讨论】:

    • 好的,这很好地解释了为什么当我明确包含{id:$scope.myId} 时路由工作。但是,当我通过 get({id: someID}) 实例化 $resource 服务时,defaultParameters 是否应该已经解决了这个问题?至少我从示例中得到了这种印象——他们声称调用转到 url/{id},即使他们没有为 $delete 明确指定 id!
    • 好吧,这解决了我的第一个问题:我将 id 值默认为{id: '@_id'}。由于下划线,这无法解析为相应数据对象的id-变量。当我将默认参数定义为 {id: '@id'}! 时,路由按预期工作
    【解决方案2】:

    您想让用户(不要大写)服务上的方法显式:

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

    【讨论】:

    • 为什么不使用大写的服务?在我的应用程序中,我总是将第一个字母用作大写字母,对此没有任何问题。您可以更好地将服务与变量区分开来!
    • 这并不常见。在 Angular 中,我们只将控制器的第一个字符大写。请参阅 John Papa (github.com/johnpapa/angular-styleguide) 的风格指南。对于资源,您确实会看到大写字母,但对于服务却没有。
    • 在上面链接的示例、Angular 文档和 Angular phonecat-Tutorial 中完成了大写,所以我认为这是标准的。但是,我现在正在尝试您的建议 - 感谢您的回答!
    • 使用你的代码我得到TypeError: user.get(...) is undefined
    • 啊,我没测试。我更新了东西,所以也许对你有用
    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2015-02-19
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多