You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular内存数据库执行删除、更新操作时无法获取对应ID的解决方法咨询

可行解决方法汇总

方案1:先查询匹配记录拿到ID后再执行操作

angular-in-memory-web-api 天生支持查询参数过滤数据,你可以先新增一个查询方法,根据表单拿到的ProviderCode和ProviderType匹配到对应记录,拿到ID后再调用删除/更新接口:

// 服务中新增按两个字段匹配记录的方法
public getAirlineByParams(code: string, type: string) {
  return this.httpClient.get(`${this.SERVER_URL}Data?ProviderCode=${code}&ProviderType=${type}`);
}

// 组件中删除逻辑示例
deleteAirline(formValue: {ProviderCode: string, ProviderType: string}) {
  this.airlineService.getAirlineByParams(formValue.ProviderCode, formValue.ProviderType).subscribe((res: any[]) => {
    if (res.length) {
      const targetId = res[0].id;
      this.airlineService.deleteAirlines(targetId).subscribe(() => {
        // 删除成功后续逻辑
      })
    }
  })
}

方案2:组件操作时直接携带ID字段(最推荐)

通常航空公司列表页渲染时,你调用getAllAirlines拿到的所有记录本身就带id字段,你可以在点击删除/编辑按钮时,直接把整条记录传递给操作表单,把ID作为隐藏字段存在表单中,提交操作时直接读取ID使用,不需要额外查询:

<!-- 列表页示例 -->
<div *ngFor="let airline of airlineList">
  <span>{{airline.ProviderName}}</span>
  <button (click)="openDeleteModal(airline)">删除</button>
  <button (click)="openEditModal(airline)">编辑</button>
</div>
// 组件中打开删除弹窗的逻辑
openDeleteModal(airline: any) {
  this.deleteForm.patchValue({
    id: airline.id,
    ProviderCode: airline.ProviderCode,
    ProviderType: airline.ProviderType
  })
}

// 提交删除时直接取ID
submitDelete() {
  const id = this.deleteForm.value.id;
  this.airlineService.deleteAirlines(id).subscribe();
}

方案3:自定义内存数据库主键

如果ProviderCode+ProviderType是全局唯一的组合,你可以直接把这个组合作为主键使用,无需依赖默认的自增ID:

// 修改createDb逻辑,拼接两个字段作为主键
createDb(){
  let Data= [
    {id: '9W-_Domestic' , ProviderCode: '9W-', ProviderName: 'Jet Airways', ProviderType: 'Domestic' },
    {id: 'EK-_International' , ProviderCode: 'EK-', ProviderName: 'Emirates', ProviderType: 'International' },
  ];
  return {Data};
}

// 后续删除/更新时直接拼接两个字段作为ID即可
public deleteAirlines(code: string, type: string){
  const targetId = `${code}_${type}`;
  return this.httpClient.delete(`${this.SERVER_URL + 'Data'}/${targetId}`);
}

方案4:重写内存数据库的请求处理逻辑

你可以在实现InMemoryDbService的类中重写delete、put方法的处理逻辑,自定义匹配规则,无需依赖ID匹配:

// 你的内存数据库服务类中新增以下逻辑
import { RequestInfo } from 'angular-in-memory-web-api';

delete(reqInfo: RequestInfo) {
  const collectionName = reqInfo.collectionName;
  const [code, type] = reqInfo.url.split('/').slice(-2);
  const collection = reqInfo.collection as any[];
  const targetIndex = collection.findIndex(item => item.ProviderCode === code && item.ProviderType === type);
  if (targetIndex > -1) {
    collection.splice(targetIndex, 1);
  }
  return reqInfo.utils.createResponse$(() => ({
    status: 204,
    body: {}
  }));
}
// put方法可以参照上面的逻辑重写

这种方法可以直接复用你现在写的删除、更新接口的调用方式,不需要调整业务代码。

内容的提问来源于stack exchange,提问作者Ambika Trikha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:09:04