example cannot angular in-memory-database

cannot - MĂșltiples colecciones en Angular-in-memory-web-api



cannot find module angular in memory web api (2)

¿Cómo creamos múltiples colecciones utilizando Angular-in-memory-web-api? No es un problema con una sola colección. Pero no se puede implementar para múltiples colecciones.

Por ejemplo. Quiero crear, por ejemplo, dos colecciones en la memoria db - País y ciudades ¿Alguna idea?


El enfoque descrito en la respuesta de Paul es correcto, sin embargo, hay un detalle que omití y me gusta agregar: ¿Cómo se especifica el genId correctamente, por lo que funciona para ambas colecciones?

La respuesta se refiere al ejemplo de "Héroes" escrito en TypeScript (un superconjunto de JavaScript), específicamente el capítulo HTTP . Allí se simula una mesa de heroes implementando:

export class InMemoryDataService implements InMemoryDbService { createDb() { const heroes = [ { id: 11, name: ''Mr. Nice'' }, { id: 12, name: ''Narco'' }, // ... { id: 20, name: ''Tornado'' } ]; return {heroes}; } // Overrides the genId method to ensure that a hero always has an id. // If the heroes array is empty, // the method below returns the initial number (11). // if the heroes array is not empty, the method below returns the highest // hero id + 1. genId(heroes: Hero[]): number { return heroes.length > 0 ? Math.max(...heroes.map(hero => hero.id)) + 1 : 11; } }

Ahora, si agrega una segunda crises colección como se muestra, ¿cómo proporciona el genId para ambas colecciones? La sobrecarga, como lo haría en C# no funciona en TypeScript, arrojaría un error ("Implementación de función duplicada").

Solución: Descubrí que puede resolver este problema con Genéricos de la siguiente manera. Reemplace la función genid genId por la siguiente versión genérica:

genId<T extends Hero | Crises>(myTable: T[]): number { return myTable.length > 0 ? Math.max(...myTable.map(t => t.id)) + 1 : 11; }

Lo importante aquí es la parte <T extends Hero | Crises> <T extends Hero | Crises> : significa que el tipo T puede ser Hero o Crises : Por lo tanto, se invocará si el parámetro pasado es de tipo Hero[]'' or Crisis [] `.

Nota: como requisito previo, ambas clases ( Hero y Crises ) deben tener una propiedad de id numérica declarada.

Enlaces útiles:


Solo devuélvalo un objeto con ambas matrices. En el ejemplo de Angular, ves algo como

createDb() { let heroes = [ .. ] return { heroes } }

Si aún no lo sabes, { heroes } es solo una abreviatura para escribir { heroes: heroes } . Entonces, si tiene dos colecciones, solo agréguelas como otra propiedad.

createDb() { let heroes = [ .. ]; let crises = [ .. ]; return { heroes, crises }; // or { heroes: heroes, crises: crises } }

El nombre de la propiedad devuelta se utilizará para la ruta en la URL. Así que puedes usar

/api/heroes/1 /api/crises/1