按类别显示广告的角度问题

用户名

我有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();
}

该组件不知道何时应用过滤器。要解决此问题,您可以做两件事。

  1. 一种简单的方法是创建一个完全相同的新组件,但是立即应用过滤器。
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);
    }
}
  1. 在当前组件中,检查是否设置了类别名称,如果已设置,则应用过滤器:
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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rails-按类别显示所有问题

来自分类Dev

Jekyll按类别显示收藏

来自分类Dev

按类别显示用户的帖子

来自分类Dev

按类别显示查询结果

来自分类Dev

创建弹性搜索查询以按类别显示随机5个问题

来自分类Dev

Facebook行动网路广告显示问题

来自分类Dev

在非活动类别中显示admob插页式广告

来自分类Dev

按类别ID显示magento产品

来自分类Dev

使用PHP按类别显示表组

来自分类Dev

如何按特定类别显示我的产品

来自分类Dev

按类别显示所有帖子

来自分类Dev

如何按当前类别显示热门帖子?

来自分类Dev

短代码以按类别显示产品woocommerce

来自分类Dev

Linq按产品分类,但显示类别

来自分类Dev

按数组中的类别进行角度过滤

来自分类Dev

Bigquery Stackoverflow-按类别查询已关闭的问题

来自分类Dev

KnockoutJS显示按项目类别排序的列表

来自分类Dev

Rails:如何按类别求和和显示总量

来自分类Dev

通过WooCommerce按类别显示所有产品

来自分类Dev

按类别分组以显示SQL中月份的差异

来自分类Dev

jQuery按类别和ID组合显示div

来自分类Dev

按列计算和创建类别年龄显示总和

来自分类Dev

使用多维数组按类别分组和显示MySQL结果

来自分类Dev

Rails:如何按类别求和和显示总量

来自分类Dev

按类别显示除选定帖子以外的所有帖子

来自分类Dev

WordPress搜索结果按类别显示多个循环

来自分类Dev

用于按类别和标签显示帖子的 WordPress URL

来自分类Dev

如何按类别显示不同帖子类型的相关帖子

来自分类Dev

如何按用户订阅主题类别显示主题