2016-08-18 1 views
0

Nehmen wir an, ich habe eine Reihe von Büchern, die ich von einem Endpunkt wie /api/books.Machen Sie mehrere Anfragen von Array von Objekten und erweitern Sie Daten mit Angular

[{ 
    name: 'Book 1', 
    id: 1 
}, { 
    name: 'Book 2', 
    id: 2 
}, { 
    name: 'Book 3', 
    id: 3 
}] 

Ich habe einen BookService, der die Kategorien für ein einzelnes Buch abruft. Zum Beispiel macht dies eine Anfrage an /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 
    }; 
} 

In meinem Weg habe ich einen Entschluß (mit ui-Router), die alle Bücher zuerst bekommt und in die BookCtrl injiziert:

In meinem Beispiel Controller

resolve: { 
    books: ['BookService', function(BookService) { 
    return BookService.getAll(); 
    }] 
} 
, Ich möchte das books Ergebnis mit den Kategorien jedes Buches verbessern. So zum Beispiel, mag ich books so etwas wie die folgenden für meinen Controller sein:

[{ 
    name: 'Book 1', 
    id: 1, 
    categories: ['adult', 'horror'] 
}, { 
    name: 'Book 2', 
    id: 2, 
    categories: ['scifi'] 
}, { 
    name: 'Book 3', 
    id: 3, 
    categories: ['comedy'] 
}] 

Wie kann ich eine zusätzliche resolve (oder verwenden Sie die bereits vorhandenes) dies zu erreichen?

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

nicht zu hart denken. Machen Sie einfach, dass Ihre API die richtigen Daten in einem Aufruf zurückgibt, anstatt einen Dienst in einer Schleife aufzurufen. – gyc

Antwort

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

Hm, schien nicht für mich zu arbeiten. Habe gerade ein Array von 'undefined's – cusejuice

+0

Ich nehme an,' BookService.getCategories' gibt ein Versprechen (eindeutig hat es eine '.then' Methode?) –

Verwandte Themen