Angular 调用服务逻辑
1,proejcts初始化赋值不需要了。
projects = [ { id: 1, name: "企业协作平台", desc: "这是一个企业内部项目", coverImg: "assets/images/covers/0.jpg" }, { id: 2, name: "自动化测试项目", desc: "这是一个企业内部项目", coverImg: "assets/images/covers/1.jpg" } ];
在构造函数中赋值。
constructor(private dialog: MatDialog, private cd: ChangeDetectorRef, private projectService: ProjectService) { this.projectService.get("37489e0c-df34-c261-71c4-ce75357e3035").subscribe(projects => this.projects = projects); }
2,装loadsh
npm i --save loadash
npm i --save-dev @types/lodash
private getThumbnails() { return _.range(0, 40).map(i => `/assets/img/covers/${i}_tn.jpg`); }
3, 初始projects为空的问题。
脏值检测
this.projectService.get("37489e0c-df34-c261-71c4-ce75357e3035").subscribe( projects => { this.projects = projects; this.cd.markForCheck(); } );
4,用filter代替 if (!project) return;
dialogRef.afterClosed().subscribe((project) => { if (!project) return; this.projectService.add(project); this.cd.markForCheck(); });
用filter代替
dialogRef.afterClosed().pipe(filter(n => n)).subscribe((project) => { this.projectService.add(project); this.cd.markForCheck(); });
5, subscribe()中返回的还是一个流,
this.projectService.add(project);返回还是流
我们不做subscribe()中的subscribe()。两个流就应该可以合并。
switchMap中调用service,返回的还是一个流,所以要拍扁。
dialogRef.afterClosed() .pipe( filter(n => n), switchMap(v => this.projectService.add(v))) .subscribe(project => console.log(project));
6,保存后返回的是缩略图,把缩略图转成大图。
Object coverImg: "/assets/images/covers/9_tn.jpg" desc: "aa" id: "Kd27aid" name: "test"
dialogRef.afterClosed() .pipe( filter(n => n), map(val => ({ ...val, coverImg: this.buildImgSrc(val.coverImg) })), switchMap(v => this.projectService.add(v))) .subscribe(project => console.log(project)); private buildImgSrc(img: string): string { return img.indexOf('_') > -1 ? img.split('_')[0] + '.jpg' : img; }
7, 怎样unsubscribe?用take(1)代替unsubscribe()。节省unsubscribe。
不管是保存,还是关闭只需要take(1)一次。
dialogRef.afterClosed() .pipe( take(1), filter(n => n), map(val => ({ ...val, coverImg: this.buildImgSrc(val.coverImg) })), switchMap(v => this.projectService.add(v))) .subscribe(project => { this.projects = [...this.projects, project]; this.cd.markForCheck(); });
8,编辑project返回的结果在前端处理
const index = this.projects.map(p => p.id).indexOf(project.id); this.projects = [...this.projects.slice(0, index), project, ...this.projects.slice(index + 1)];
9,在ngOnDestory中取消订阅
constructor(private dialog: MatDialog, private cd: ChangeDetectorRef, private projectService: ProjectService) { this.sub = this.projectService.get("37489e0c-df34-c261-71c4-ce75357e3035").subscribe( projects => { this.projects = projects; this.cd.markForCheck(); } ); } ngOnDestroy(): void { if (this.sub) { this.sub.unsubscribe(); } }
如果觉得本文对您有帮助~可以
微信支持一下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2019-02-25 Egg
2019-02-25 Egg.js
2016-02-25 jquery——移动端滚动条插件iScroll.js