AngularJS:具有嵌套资源的$ resource

Dar*_*arz 12 rest restful-url angularjs

我正在使用AngularJS $资源模型来REST API.我有这样的事情:

angular.module('libraryapp')
    .factory('Book', function($resource){
        return $resource('books/:id');
    });
Run Code Online (Sandbox Code Playgroud)

我用这种方式:

Book.get({ id: 42 }, function(book) {
    console.log(book);
});
Run Code Online (Sandbox Code Playgroud)

但我也想要一个端点到子资源,让我们说:

GET /books/:id/comments
Run Code Online (Sandbox Code Playgroud)

我该如何在模块中定义它?我可以用某种方式扩展Book,就像这样使用它

Book.get({ id: 42 }).Comment.query(function(comments) {
    console.log(comments);
});
Run Code Online (Sandbox Code Playgroud)

Mar*_*ang 7

您可以使用AngularJS $resource定义轻松访问嵌套的RESTful资源.

线索是了解$ resource定义params中每个动作定义(在列表中actions)的参数是如何工作的.正如文档所说,它是一个

此操作的可选预绑定参数集.[...]

angular.module('libraryApp').factory('Book', [
  '$resource', function($resource) {
    return $resource('books/:id/:subResource', {}, {
      comments: {  // The `comments` action definition:
        params: {subResource: 'comments'},
        method: 'GET'
      }
    });
  }
]);
Run Code Online (Sandbox Code Playgroud)

鉴于上述定义,您仍然可以Book像以前一样使用.例如,Book.get({ id: 42 })转换为GET books/42/请求.

但是,鉴于URL()的新:subResource部分,您现在可以生成一个$resource'books/:id/:subResource'

GET books/42/comments
Run Code Online (Sandbox Code Playgroud)

通过调用请求,要么 Book.get({ id: 42, subResource: 'comments' })或更短期和简洁的界面Book.comments({ id: 42 })定义为您的comments行动.

  • 此解决方案的问题是返回的注释将是Book资源的实例.所以,如果我们调用`Book.comments({id:42}).$ promise.then(function(comments){comments [0].$ get();});`那么这个`$ get`将尝试` GET/books/<commend_id>`这当然是不对的. (2认同)

kum*_*rsh 2

据我所知,您无法嵌套资源,但执行您要查找的操作非常简单:

您可以定义可选参数,您可以在每个资源中覆盖这些参数(如此处category),甚至覆盖 url(查看资源otherUrl

angular.module('libraryApp').factory('Book', [
  '$resource', function($resource) {
    return $resource('books/:id/:category', {}, {
      comments: {
        method: 'GET',
        action: 'category'
      },
      otherUrls: {
        method: 'GET',
        url: 'books/:id/admin/:option'
      }
    });
  }
]);
Run Code Online (Sandbox Code Playgroud)