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,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 全程使用 AI 从 0 到 1 写了个小工具
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· AI 插件第二弹,更强更好用
· Blazor Hybrid适配到HarmonyOS系统
2019-02-25 Egg
2019-02-25 Egg.js
2016-02-25 jquery——移动端滚动条插件iScroll.js