【发布时间】:2018-12-05 02:56:53
【问题描述】:
我正在处理屏幕左侧有类别的项目,通过按屏幕中间的每个类别应该显示属于所选类别的文章/产品。
我很简单地把左边的分类画成这样:
category: Category[];
ngOnInit() {
this.category= this._activatedRoute.snapshot.data['category'];
}
在我的模板 .html 文件中,我只是显示了它们并在每个文件上附加了事件:
<div class="tab-content categories-tab-content">
<div class="tab-pane" id="food">
<ul>
<li *ngFor="let c of category;">
<button type="button" data-toggle="" data-target="" class="btn categories-btn" (click)="getArticlesByCategory(c.id)">
{{subgroup.title | uppercase}}
</button>
</li>
</ul>
</div>
</div>
如您所见,getArticlesByCategory 方法的位置如下:(click)="getArticlesByCategory(c.id)
因此,当用户点击每个类别时,都会调用此方法:
getArticlesByCategory(selectedCategoryId: string) {
this._articleService.getArticlesByCategory(selectedCategoryId).subscribe(articles => {
this.category= category;
});
文章被提取了,我试过console.log 他们在那里..
这是我的第二个组件,应该显示该文章:
import { Component, OnInit, Input } from '@angular/core';
import { Article } from '../../models/article';
@Component({
selector: 'app-main-article',
templateUrl: './article.component.html',
styleUrls: ['./article.component.css']
})
export class ArticleComponent implements OnInit {
// Here I've created `@Input` because I think it needs to receive this list of articles
@Input() category: Article[];
constructor() { }
ngOnInit() {
}
}
这是我的组件的模板文件,应该接收和显示文章:
<div *ngFor="let product of products ;" class="article-holder">
<div id="article1" class="article">
<p class="article-price">product.price</p>
<p class="article-title">product.title</p>
</div>
</div>
正如您在我的模板文件中看到的,代码已准备好循环该列表,但我不知道如何获取它,谁能解释一下如何执行此操作?
谢谢 干杯
【问题讨论】:
-
最好在两个组件中使用共享服务。只有当您将数据从父级传递给子级时,@Input 装饰器才会起作用。
-
有一个工作的 plunker 演示了如何在对类似问题的回答中做到这一点:stackoverflow.com/a/48368909/7840778
-
@Steveland83 请检查我的编辑。我想出了解决方案,但是每次单击都会执行两次..(检查您提供给我的链接以查看完整代码)这通常是比使用@Input@Output更好的解决方案吗?你能解释一下为什么吗?非常感谢
-
@Roxy'Pro 很难说没有看到完整的代码,但有几件事需要检查:1. 确保您在页面导航等上取消订阅您的 observables。2. 是否有多个具有此逻辑的组件(或重复一个组件)? - 如果是这样,那么您需要区分每个组件并发送带有参数的调用。
-
@Steveland83 我怎样才能检查这个:“确保你在页面导航等上取消订阅你的观察。”去哪里看?我还不太明白这个:/
标签: angular typescript angular-components angular-decorator