与AngularJS中的REST资源的链接(关系)

时间:2013-12-09 17:30:40

标签: javascript rest angularjs hypermedia ngresource

我有一个REST API,它返回User对象,其中的角色是通过链接到另一个对象来指定的。所以在localhost/project/api/users/27/是JSON对象:

{
    "id": 42,
    "name": "John",
    "prijmeni": "Doe",
    "login": "johndoe",
    "nickname": null,
    "grade": 1.3,
    "roles": {
        "href": "http://localhost/project/api/users/1716/roles/"
    }
}

我要做的是在控制器中获得角色。我的用户服务如下所示:

projectServices.factory('User', ['$resource', 'UserRoles',
    function($resource, UserRoles, Role) {
        var User = $resource('http://localhost/project/api/users/:id', {}, {
            'query': {
                method: 'GET',
                isArray: true
            }
        });
        return User;
    }
]);

我尝试添加(到该资源代码块):

User.prototype.roles= function(){
   return UserRoles.get({id:42});
};

这个在ngRepeat中调用时会冻结浏览器。所以我试过

User.prototype.roles = UserRoles.get({id:42});
这是有效的。然后我试了

User.prototype.roles = $resource(this.roles.href, {}, {
   'get': {
      method: 'GET',
      isArray: true
   }
});

说,roles未定义。我还尝试将transformResponse param添加到用户服务GET操作中,但该函数从未被调用过。

第二个选项非常合适 - 除了我必须硬编码用户ID。合适的解决方案是以某种方式为我获取用户ID(我尝试this.id,但这不起作用)。

完美的解决方案是从给定的href创建资源,但由于我无法在原型中访问roles,我不知道如何。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题

projectServices.factory('UserRoles', function(){
    return $resource('http://localhost/project/api/users/:id', {id: @id}, 
        {'query': {
            method: 'GET',
            isArray: true
        })
}

现在你可以用

来调用它
UserRoles.get({id:42})  
// this makes the request :     http://localhost/project/api/users/42

@id 告诉angular使用传递的参数中的 id 键。