Angular 内存中web api中的多个集合
如何使用角内存web api创建多个集合? 单个集合没有问题。但我无法为多个集合实现它Angular 内存中web api中的多个集合,angular,api,in-memory-database,Angular,Api,In Memory Database,如何使用角内存web api创建多个集合? 单个集合没有问题。但我无法为多个集合实现它 例如,我想在内存数据库中创建两个集合——Country和Cities。知道怎么做吗?只需返回一个包含两个数组的对象即可。在Angular的示例中,您可以看到如下内容 createDb(){ 让英雄=[…] 返回{英雄} } 如果您还不知道这一点,{heromes}只是编写{heromes:heromes}的简写。因此,如果您有两个集合,那么只需将其添加为另一个属性即可 createDb(){ 让英雄=[…]
例如,我想在内存数据库中创建两个集合——Country和Cities。知道怎么做吗?只需返回一个包含两个数组的对象即可。在Angular的示例中,您可以看到如下内容
createDb(){
让英雄=[…]
返回{英雄}
}
如果您还不知道这一点,{heromes}
只是编写{heromes:heromes}
的简写。因此,如果您有两个集合,那么只需将其添加为另一个属性即可
createDb(){
让英雄=[…];
让危机=[…];
返回{英雄,危机};
//或者{英雄:英雄,危机:危机}
}
返回的属性名称将用于URL中的路径。所以你可以用
/api/heroes/1
/api/crises/1
中描述的方法是正确的,但是我想补充一个细节:如何正确指定genId
,使其适用于两个集合?
答案是指用(JavaScript的超集)编写的“英雄”示例,特别是。
在那里,通过实现以下功能模拟表heroes
:
导出类InMemoryDataService实现InMemoryDbService{
createDb(){
康斯特英雄=[
{id:11,姓名:'尼斯先生'},
{id:12,名字:'毒品'},
// ...
{id:20,名字:'龙卷风'}
];
返回{英雄};
}
//重写genId方法以确保英雄始终具有id。
//如果英雄阵是空的,
//下面的方法返回初始数字(11)。
//如果英雄数组不是空的,下面的方法将返回最大值
//英雄id+1。
精灵(英雄:英雄[]):编号{
return heromes.length>0?Math.max(…heromes.map(hero=>hero.id))+1:11;
}
}
现在,如果您添加一个第二集危机
,如他的回答所示,即:
createDb(){
让英雄=[{…},…];
让危机=[{…},…];
返回{英雄,危机};
//或者{英雄:英雄,危机:危机}
}
您如何为这两个集合提供genId
(前提是它们属于Hero
和crisis
)类型?重载,正如您在C#
中所做的那样,在TypeScript中不起作用,它会抛出一个错误(“复制函数实现”)
解决方案: 我发现,您可以使用解决此问题,如下所示。用以下通用版本替换otiginal
genId
功能:
genId(myTable:T[]):编号{
返回myTable.length>0?Math.max(…myTable.map(t=>t.id))+1:11;
}
这里重要的是
部分:这意味着类型T
可以是Hero
或crisis
:因此,如果传递的参数类型是Hero[]
或crisis[]
,则将调用它
有了这些知识,加上第三、第四。。。类很简单:只需附加类即可。假设我们想要添加类SuperHero
,然后您只需通过|SuperHero
附加它,这样它看起来就像:
genId(myTable:T[]):编号{
返回myTable.length>0?Math.max(…myTable.map(t=>t.id))+1:11;
}
注意:作为先决条件,所有类(英雄
、危机
和超级英雄
)都需要声明一个数字id
属性
有用的链接:
addHero(英雄:字符串):无效{
this.log(`In addHero of heroComponent,名称为:${hero}`);
if(!hero)
{
这个.log(`In if(!hero.name)的addhero:${hero}`);
返回;
}
this.heroService.addHero({name:hero}作为部分)
.订阅(英雄=>{
这个。英雄。推(英雄);
});
}
然后我更新了heros.service.ts文件以使用部分hero,并允许代码从in-memory-data.service.ts生成自己的id:
addHero(英雄:部分):可观察{
this.log(`In addHero:heroneName为:${hero.name}`);
返回this.http.post(this.heroesUrl,hero,this.httpOptions).pipe(
点击((新英雄:英雄)=>
this.log(`added hero with string id=${newHero.id}`),
catchError(this.handleError(“addHero中的错误”));
}
据我所知,它现在正按预期工作。可能还有一些代码需要更新,但这将有助于出现以下错误消息的任何人:
src/app/heroes/heroes.component.ts:52:30中出错-错误TS2352:将类型{name:never;}转换为类型“Hero”可能是错误的,因为两种类型都没有充分重叠。如果这是有意的,请先将表达式转换为“未知”。
属性“id”在类型“{name:never;}”中丢失,但在类型“Hero”中是必需的。
这太好了-但是也覆盖了精灵(英雄:英雄[]):数字{…}
。现在我已经尝试过重载它来使用crisis
(即genId(crisis:crisis[]):number{…}
),但到目前为止运气不佳(“重复函数实现”)。你会怎么做?(在本例中,它返回能够添加新项目的最大id+1)最终找到了一种方法,并将其作为附加信息发布到您的答案中。@Matt,n
if (!hero)
{
this.log(`In if(!hero.name) of add hero: ${hero}`);
return;
}
this.heroService.addHero({ name: hero } as Partial<Hero>)
.subscribe(hero => {
this.heroes.push(hero);
});