在角内存的Web-API多个集合

问题描述 投票:34回答:2

我们如何使用角内存,网络的API来创建多个集合?不是一个单集的问题。但我没能实现它的多个集合。

例如,我想创建说,在内存数据库两个集合 - 国家和城市。任何想法,该怎么做?

angular api in-memory-database
2个回答
60
投票

只是两个数组返回一个对象。在从角的例子,你看到这样

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

如果你还不知道这一点,{ heroes }只是写{ heroes: heroes }简写。所以,如果你有两个集合,然后只需将其添加为另一个属性

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

返回的属性的名称将用于在URL路径。所以,你可以使用

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

13
投票

Paul's answer描述的方法是正确的,但有一个细节我错过了,我想补充:你如何正确指定genId,所以它适用于两个集合?

答案是指“英雄”示例写入TypeScript(JavaScript的一个超集),特别是HTTP chapter。在那里,一台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;
  }
}

现在,如果你添加第二个集合crises如图他的答案,即:

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

你怎么了两个集合(只要它们类型genIdHero的)提供Crises?超载,因为你会做它C#在打字稿不起作用,它会抛出一个错误(“复制功能实现”)。


解决方案:我发现,你可以按如下解决这一问题TypeScript's 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可以是HeroCrises:所以,如果传递的参数是任一类型Hero[]Crises[]就会被调用。

有了这些知识,增加了第三,第四,...类很简单:只需追加类。说,我们要添加的类别SuperHero,那么你只需要通过| SuperHero追加它,所以它看起来像:

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

注:作为先决条件,所有类(HeroCrisesSuperHero)需要有一个数字id财产申报。


相关链接:

© www.soinside.com 2019 - 2024. All rights reserved.