我有symfony5 / angular10项目,它由三个角度组成:类别(用于创建菜单的类别-简单的类别列表),广告(列出所有广告),单个广告(按ID显示广告)。
基于应用程序路由中的这些组件,我得到了三种路由:
{ path: 'adverts', component: AdvertsComponent },
{ path: 'advert/category/:name', component: AdvertsComponent },
{ path: 'advert/:id', component: AdvertSingleComponent },
第一条和最后一条路线都可以正常工作,我可以列出所有广告并显示单个广告,但是无法按类别列出广告-与列出所有广告时得到的结果相同(网络检查器显示正在点击相同的路线)。我用Postman检查了我的api,所以我知道所有三个路由都可以正常工作,所以我想问题出在我的角度代码上。
我怀疑广告成分
import { Component, OnInit } from '@angular/core';
import { DatePipe } from '@angular/common';
import { Advert } from '../advert';
import { AdvertService } from '../advert.service';
@Component({
selector: 'app-adverts',
templateUrl: './adverts.component.html',
styleUrls: ['./adverts.component.css']
})
export class AdvertsComponent implements OnInit {
adverts: Advert[];
constructor(private advertService: AdvertService, public datepipe: DatePipe) {}
ngOnInit() {
this.getAdverts();
}
getAdverts(): void {
this.advertService.getAdverts()
.subscribe(adverts => this.adverts = adverts);
}
getAdvertsByCategory(name): Advert {
return this.adverts.find(advert => advert.category === name);
}
}
如您所见,ngOnInit仅具有getAdverts方法,如果在此添加getAdvertsByCategory,则在控制台中将得到this.adverts是未定义的。
有什么线索吗?
更新
多亏了user2403735的回答以及他关于在api中进行繁重而不是倾斜的注释,我想到了这段代码,从api中获取了预过滤的日期,以避免客户端过滤。
看到ngOnInit方法中注释掉的行了吗?这是因为如果html组件被重用,快照将不起作用,如果我单击一个类别,然后单击另一个类别,则视图将不会使用第二个类别的数据进行更新,它只会保留第一个单击的类别中的数据。因此,需要使用其他方法-观看此视频以获取解释Angular Tutoria 26-ParamMap Observable
import { ActivatedRoute, ParamMap } from '@angular/router';
...
constructor(private advertService: AdvertService, private route: ActivatedRoute, public datepipe: DatePipe) {}
ngOnInit() {
//let categoryName = this.route.snapshot.paramMap.get('name');
this.route.paramMap.subscribe((params: ParamMap) => {
let categoryName = params.get('name');
if (categoryName){
this.getAdvertsByCategory(categoryName);
} else {
this.getAdverts();
}
});
}
getAdverts(): void {
this.advertService.getAdverts()
.subscribe(adverts => this.adverts = adverts);
}
getAdvertsByCategory(name): void {
this.advertService.getAdvertsByCategory(name)
.subscribe(adverts => this.adverts = adverts);
}
您对两条路线使用相同的组件(AdvertsComponent)。但是,由于以下规则,在初始化组件时,_AdvertsComponent会加载所有广告。
ngOnInit() {
this.getAdverts();
}
该组件不知道何时应用过滤器。要解决此问题,您可以做两件事。
export class CategoryComponent implements OnInit {
adverts: Advert[];
...
ngOnInit() {
const categoryName = this.route.snapshot.paramMap.get("name")
this.getAdvertsByCategory(categoryName);
}
getAdvertsByCategory(categoryName) {
this.getAdverts();
this.adverts.find(advert => advert.category === categoryName);
}
getAdverts(): void {
this.advertService.getAdverts()
.subscribe(adverts => this.adverts = adverts);
}
}
export class AdvertsComponent implements OnInit {
adverts: Advert[];
....
ngOnInit() {
const categoryName = this.route.snapshot.paramMap.get("name");
if(categoryName) {
this.getAdvertsByCategory(categoryName);
} else {
this.getAdverts();
}
}
getAdvertsByCategory(name) {
this.getAdverts()
this.adverts.find(advert => advert.category === name);
}
getAdverts(): void {
this.advertService.getAdverts()
.subscribe(adverts => this.adverts = adverts);
}
}
注意:通常,我建议您在API中应用过滤器,而不要在客户端进行繁重的工作。因此,在您的http请求中,应用参数来过滤API中的数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句