Вы можете использовать функцию компонента, которая получает правильную статью от вас.Проблема в том, что эта функция будет вызываться с DoCheck
, что может быть не очень производительным.Другой вариант - создать канал многократного использования, в котором вы можете преобразовать элементы статьи в объект id -> article:
@Pipe({
name: 'keyObjects'
})
export class KeyObjectsPipe<T = any> implements PipeTransform {
transform(objects: T[], key: keyof T): {[key: string]: T}[] {
return (objects || []).map((object) => ({[object[key]]: object }));
}
}
Поскольку это чистый канал, он не будет вызываться при каждом DoCheck
, и вы можете повторно использовать эту логику для любых других объектов, которые могут иметь это.Использование будет:
<div [innerHTML]="(articles | keyObjects:'id')[articleId]?.description | translate"></div>
Другой, и, возможно, даже лучший вариант, это создать Observable, который содержит поток articleId
.Затем вы можете отобразить это вместе с потоком articles
, чтобы получить нужный объект:
//pseudo
articles$: Observable<Article[]> = this.http.get('/articles');
// if you have :article as route param
articleId$ = this.route.params.pipe(map(({ article }) => article));
// get the right article
article$ = combineLatest(
this.articles$,
this.articleId$
).pipe(
map(([ articles, articleId ]) => articles.find((article) => article.id === articleId)),
shareReplay(1)
);
Затем вы можете использовать это с async
pipe:
<div [innerHTML]="(article$ | async)?.description | translate"></div>