Angular实现弹窗表单数据先存in-memory再批量提交至后端
实现弹窗表单数据先存内存再批量提交后端的方案
需求与现有代码
我有一个表单组件和带表单的弹窗组件,希望点击弹窗表单输入数据后,先把数据保存到in-memory中,之后再将in-memory里的所有数据一次性提交到真实后端。以下是已实现的代码:
保存至in-memory的方法
save(){ this.http.post(this.appsetting.baseURL + 'users', this.serialForm.value).subscribe((res) => { console.log(res) }) }
InMemoryDataService代码
import { Injectable } from '@angular/core'; import { InMemoryDbService } from 'angular-in-memory-web-api'; @Injectable({ providedIn: 'root' }) export class InMemoryDataService implements InMemoryDbService { createDb() { const users = [ { id: 11, itemCode: 'ICT000000211', qtyReceived:0, inputs:[{ deliveryId: 0, serialNum:'string' }] }, ]; console.log(users) return { users : users }; } }
用于提交至真实后端的方法
PostAll(){ return this.http.post(this.appsetting.baseURL + 'RealBackEnd/PostItem', data) }
实现步骤
1. 确认In-Memory Web API配置
首先确保项目中已正确导入并配置InMemoryWebApiModule,在AppModule中补充配置:
import { HttpClientModule } from '@angular/common/http'; import { InMemoryWebApiModule } from 'angular-in-memory-web-api'; import { InMemoryDataService } from './in-memory-data.service'; @NgModule({ imports: [ HttpClientModule, // delay设为0避免模拟网络延迟,按需调整 InMemoryWebApiModule.forRoot(InMemoryDataService, { delay: 0 }) ], // 其他模块配置 }) export class AppModule { }
2. 完善内存数据保存逻辑
当前save方法已能将表单数据存入in-memory,需确保serialForm.value的结构和InMemoryDataService中users的对象结构完全匹配。若结构不一致,需先转换格式再发起请求。
3. 新增获取内存全量数据的方法
要批量提交,需先从in-memory中读取所有数据,新增方法:
getAllInMemoryUsers(): Observable<any[]> { return this.http.get<any[]>(this.appsetting.baseURL + 'users'); }
4. 实现批量提交到真实后端的完整逻辑
完善PostAll方法,先获取内存数据,再提交到真实后端,提交成功后清空内存避免重复提交:
import { switchMap, tap } from 'rxjs/operators'; PostAll(): Observable<any> { return this.getAllInMemoryUsers().pipe( switchMap(users => { // 可选:根据真实后端接口要求,对users数据做格式转换或校验 return this.http.post(this.appsetting.baseURL + 'RealBackEnd/PostItem', users); }), tap(() => { // 提交成功后清空内存数据 this.clearInMemoryUsers(); }) ); } // 新增清空内存数据的方法 clearInMemoryUsers(): Observable<any> { // 若in-memory支持批量删除,可直接调用对应接口;否则遍历删除 return this.http.delete(this.appsetting.baseURL + 'users'); }
5. 触发批量提交
在组件中添加触发按钮,绑定点击事件调用PostAll:
onBatchSubmit() { this.PostAll().subscribe({ next: (res) => { console.log('批量提交成功', res); // 可添加成功提示(如弹窗、Toast) }, error: (err) => { console.error('批量提交失败', err); // 处理错误逻辑(如提示用户、记录日志) } }); }
6. 注意事项
- 确保in-memory中的数据结构与真实后端接口要求一致,不一致时需在提交前做转换
- 提交成功后必须清空内存数据,防止重复提交
- 可添加加载状态(如按钮禁用、加载动画),避免用户重复点击
内容的提问来源于stack exchange,提问作者Yan
相关产品推荐
相关产品推荐

