web-dev-qa-db-ja.com

Angular-in-memory-web-apiの複数のコレクション

Angular-in-memory-web-apiを使用して複数コレクションを作成するにはどうすればよいですか?単一のコレクションでは問題ありません。しかし、複数のコレクションに実装することはできません。

たとえば、メモリデータベースにCountryとCitiesという2つのコレクションを作成したいとします。アイデア、それを行う方法は?

36
Sparrow

両方の配列を持つオブジェクトを返すだけです。 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
60
Paul Samsotha

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;
}

注:前提条件として、すべてのクラスHeroCrisesおよびSuperHero)には、数値のidプロパティを宣言する必要があります。


便利なリンク:

13
Matt