2014-11-14 4 views
11

Я использую модель ресурсов AngularJS $ для API REST. У меня что-то вроде этого:

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

Я использую в этих образом:

Book.get({ id: 42 }, function(book) { 
    console.log(book); 
}); 

Но я также хочу конечной точки к subresource, скажем:

GET /books/:id/comments 

Как следует Я определяю его в модуле? Могу ли я продлить книги в некотором роде, чтобы использовать его как этот

Book.get({ id: 42 }).Comment.query(function(comments) { 
    console.log(comments); 
}); 

ответ

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

вы можете захотеть использовать Restangular вместо этого как она обрабатывает вложенные ресурсы и чистым и простым способом.

+0

Ссылка https://github.com/mgonto/restangular –

7

Вы можете легко найти вложенные ресурсы RESTful с определениями AngularJS $resource.

Ключ, чтобы понять, как параметр params каждого действий определения (в списке actions) в $resource определении работы. Как сказано в документации, это

Дополнительный набор параметров предварительной привязки для этого действия. [...]

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

Учитывая приведенное выше определение, вы все равно должны быть в состоянии использовать Book как раньше. Например, Book.get({ id: 42 }) переводит на запрос GET books/42/.

Однако, учитывая новый :subResource часть $resource URL ('books/:id/:subResource'), теперь может генерировать запрос

GET books/42/comments 

по телефону либоBook.get({ id: 42, subResource: 'comments' }) или гораздо более короткий и элегантный интерфейс Book.comments({ id: 42 }) определен как ваш comments действий.

+0

Я знаю, что я ответил на это поздно, но если ответ будет работать для вас, было бы здорово, если бы вы приняли его как ответ - так, чтобы другие пользователи могли извлечь выгоду из зная, что ответ работает. Если у вас возникли проблемы, сообщите мне. –

+2

Проблема с этим решением заключается в том, что возвращенные комментарии будут экземплярами ресурса Book. Так что если мы будем называть 'Book.comments ({id: 42}) $ prom.then (function (comments) {comments [0]. $ Get();});' then this '$ get' будет пытаться' GET/books/ 'и это, конечно, неправильно. – djxak

+0

djxak, У вас есть альтернатива этой проблеме? –

Смежные вопросы