たとえば、/api/books
のようなエンドポイントから取得した書籍の配列があるとします。オブジェクトの配列から複数のリクエストを作成し、角度を使ってデータを拡張する
[{
name: 'Book 1',
id: 1
}, {
name: 'Book 2',
id: 2
}, {
name: 'Book 3',
id: 3
}]
私は個々の本のカテゴリを取得するBookServiceを持っています。たとえば、これは/api/book/:id/categories
に要求します。私のルートで
BookServiceを
function BookService($resource) {
var service = $resource('/api/books', {}, {
getAll: {
method: 'GET'
},
getCategories: {
url: '/api/book/:id/categories',
method: 'GET',
isArray: true
},
});
return {
getAll: getAll,
getCategories: getCategories
};
}
、私が最初にすべての書籍を取得し、BookCtrl
に注入された(UI-ルータを使用して)決意を持っている:
resolve: {
books: ['BookService', function(BookService) {
return BookService.getAll();
}]
}
、私は各書籍のカテゴリでbooks
解決の結果を増やしたいと思っています。したがって、たとえば、私はbooks
は私のコントローラのために、以下のような何かになりたい:
[{
name: 'Book 1',
id: 1,
categories: ['adult', 'horror']
}, {
name: 'Book 2',
id: 2,
categories: ['scifi']
}, {
name: 'Book 3',
id: 3,
categories: ['comedy']
}]
にはどうすれば追加の決意を作成(または既存のものを使用)これを実現することができますか?
resolve: {
books: ['BookService', function(BookService) {
return BookService.getAll();
}],
bookCategories: ['BookService', 'books', function(BookService, books) {
// this doesnt work
_.each(books, function(book) {
BookService.getCategories(book.id)
.then(function(categories) {
book.categories = categories;
})
});
// how do i return this to the controller properly?
}],
}
function BookCtrl(books, bookCategories) {
// maybe somsething like this?
var booksWithCategories = _.extend(books, bookCategories);
}
はあまりにも難しいと思いませんか。ちょうどループでサービスを呼び出すのではなく、1つの呼び出しでAPIに正しいデータを返すようにしてください。 – gyc