Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 内存中web api中的多个集合_Angular_Api_In Memory Database - Fatal编程技术网

Angular 内存中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(){ 让英雄=[…]

如何使用角内存web api创建多个集合? 单个集合没有问题。但我无法为多个集合实现它


例如,我想在内存数据库中创建两个集合——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
属性


有用的链接:


除了这个讨论之外,我还不得不使用Partial,因为它一直说我在完成第06课《英雄之旅》时丢失了一个id。我使用消息服务查看代码在停止工作之前运行了多远,因此您可以忽略this.log行,但可以将它们添加到您自己的项目中以帮助调试。首先,我更新了addHero,如下所示:


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