2016-08-18 5 views
0

たとえば、/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); 
} 
+0

はあまりにも難しいと思いませんか。ちょうどループでサービスを呼び出すのではなく、1つの呼び出しでAPIに正しいデータを返すようにしてください。 – gyc

答えて

0
resolve: { 
    books: ['BookService', function(BookService) { 
    return BookService.getAll(); 
    }], 
    bookCategories: ['$q', 'BookService', 'books', function($q, BookService, books) { 
    var promises = []; 
    _.each(books, function(book) { 
     promises.push(BookService.getCategories(book.id) 
     .then(function(categories) { 
      book.categories = categories; 
     })); 
    }); 
    return $q.all(promises); 
    }], 
} 
+0

ええ、私のために働くように見えませんでした。ちょうど 'undefined'の配列を持っています – cusejuice

+0

' BookService.getCategories'が約束を返すと仮定しています(明らかに '.then'メソッドがありますか?) –

関連する問題