Angular-in-memory-web-apiを使用して複数コレクションを作成するにはどうすればよいですか?単一のコレクションでは問題ありません。しかし、複数のコレクションに実装することはできません。
たとえば、メモリデータベースにCountryとCitiesという2つのコレクションを作成したいとします。アイデア、それを行う方法は?
両方の配列を持つオブジェクトを返すだけです。 Angularの例では、次のようなものが表示されます。
createDb() {
let heroes = [ .. ]
return { heroes }
}
まだ知らない場合は、{ heroes }
は、単に{ heroes: heroes }
。したがって、2つのコレクションがある場合は、それを別のプロパティとして追加するだけです
createDb() {
let heroes = [ .. ];
let crises = [ .. ];
return { heroes, crises };
// or { heroes: heroes, crises: crises }
}
返されるプロパティの名前は、URLのパスに使用されます。使用できます
/api/heroes/1
/api/crises/1
Paul's answer で説明されているアプローチは正しいですが、追加したい詳細が1つありませんでした。genId
を正しく指定するにはどうすればよいですか、それで両方のコレクションで動作しますか?
答えは TypeScript (JavaScriptのスーパーセット)、具体的には HTTPの章 で書かれた「ヒーロー」の例を参照しています。そこで、テーブルheroes
は以下を実装することによりシミュレートされます:
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;
}
}
ここで、彼の答えに示されているように、2番目のコレクションcrises
を追加すると、つまり:
createDb() {
let heroes = [ { ... }, ... ];
let crises = [ { ... }, ... ];
return { heroes, crises };
// or { heroes: heroes, crises: crises }
}
両方のコレクションにgenId
を提供するにはどうすればよいですか(タイプがHero
およびCrises
である場合)?オーバーロードは、C#
で行うようにTypeScriptで機能しないため、エラー( "重複した関数の実装")がスローされます。
解決策:TypeScriptのGenerics次のとおり。 otiginal genId
関数を次の汎用バージョンに置き換えます。
genId<T extends Hero | Crises>(myTable: T[]): number {
return myTable.length > 0 ? Math.max(...myTable.map(t => t.id)) + 1 : 11;
}
ここで重要なのは<T extends Hero | Crises>
:T
型はHero
またはCrises
のいずれかであるということです。したがって、渡されたパラメーターが次のいずれかである場合に呼び出されます。タイプHero[]
またはCrises[]
の。
その知識があれば、3番目、4番目、...クラスを追加するのは簡単です:クラスを追加するだけです。クラスSuperHero
を追加する場合、| SuperHero
を介して追加するだけなので、次のようになります。
genId<T extends Hero | Crises | SuperHero>(myTable: T[]): number {
return myTable.length > 0 ? Math.max(...myTable.map(t => t.id)) + 1 : 11;
}
注:前提条件として、すべてのクラス(Hero
、Crises
およびSuperHero
)には、数値のid
プロパティを宣言する必要があります。
便利なリンク: