Quiero poder instanciar una clase modelo, pero también darle acceso a los servicios.
Por ejemplo, supongamos que tengo estos puntos finales:
/book/:id /book/:id/author Quiero tener un servicio BooksService para obtener una lista de una instancia de Book . Me gustaría que las instancias del libro se crearan con new , dada una definición JSON a través del constructor, sin dejar de poder usar dependencias angulares.
Ejemplo de lo que quiero hacer:
BooksService.getBook(1) // makes call to /book/1 .subscribe((book) => { book.getAuthor() // makes call to /book/1/author ... }); Para lograr esto, traté de usar una fábrica para crear una new instancia de un modelo de libro. Luego paso una referencia a la dependencia inyectada de Http que inyecta la fábrica.
Esto es lo que tengo:
LibrosServicio
@Injectable() export class BookService { constructor( private http: Http, private bookModelFactory: BookModelFactory ) {} getBook(): Observable<BookModel> { return this.http.get('http://localhost:3000/book/1') .map((res) => { return this.bookModelFactory.make(res.json().data); }); } }LibroModelo, BookModelFactory
@Injectable() export class BookModelFactory { constructor (private http: Http) {} make(def: object): BookModel { var book = new BookModel(def); book.http = this.http; return book; } } export class BookModel { def: any; http: Http; constructor (def: object) { this.def = def; } getAuthor() { console.log('http', this.http); this.http.get('http://localhost:3000/book/1/author'); } } Cuando trato de usar este código, veo el registro de la consola para el objeto http en book.getAuthor() . Existe, y puedo ver el método get en él. Pero nunca hace la solicitud de API. Nada en la pestaña de red tiene nada sobre una llamada a /book/1/author . No hay errores. En pocas palabras, no pasa nada.
¿Por qué no se realiza la solicitud cuando se llama a this.http.get('...') en getAuthors() ?
Gracias por adelantado.
Usando Angular 4.
(Las declaraciones de importación se eliminan por brevedad)
2) Si esta es una buena estrategia... ¿por qué no se realiza la solicitud cuando se llama a this.http.get('...') en getAuthors()?
Porque nunca nadie se suscribió a los resultados de esta convocatoria:
this.http.get('http://localhost:3000/book/1/author').subscribe(res => { // do something with the results here });En angular, si no se suscribe a los resultados de la llamada HTTP, esta llamada nunca se realizará.
O tal vez desee que su método getAuthor devuelva un Observable<Author> para que sea la persona que llama a este método la que pueda suscribirse a los resultados:
getAuthor(): Observable<Author> { return this.http.get('http://localhost:3000/book/1/author').map(res => { return res.json().data; }); }Para que puedas suscribirte más tarde:
BooksService.getBook(1) // makes call to /book/1 .subscribe(book => { book.getAuthor() // makes call to /book/1/author .subscribe(author => { // do something with the book author here }); ... });Así que recuerda, si no te suscribes, no se realizará la llamada AJAX.