Еще раз я думаю, что мне не хватает понимания в Угловом 4!
У меня есть страница, доступ к которой осуществляется по маршруту, и я пытаюсь получить сообщение по url-slug OnInit. Сообщение находится в массиве Promises, который я кэширую с предыдущей страницы (это список страниц сообщений). Страница списка отлично работает. Весь мой контент кэшируется и считывается из кеша. Я попытался отключить эту функцию, такая же проблема возникает.
Вот сервис, который извлекает сообщения.
articles: Promise<Article[]>;
/**
* fetch a list of articles
*/
getArticles(): Promise<Article[]> {
// cached articles
if (this.articles) {
return this.articles;
}
// no articles fetched yet, go get!
return this.articles
= this.http.get(this.url, this.options)
.toPromise()
.then(response => response.json() as Article[])
.catch(this.handleError);
}
/**
* fetch a single article by url slug
* @param slug
*/
getArticle(slug: string): Promise<Article> {
return this.getArticles()
.then(articles => articles.find(article => article.slug == slug));
}
и это то, что получает его от компонента SinglePost:
article: Article
ngOnInit(): void {
this.getArticle();
}
getArticle(): void {
this.route.paramMap
.switchMap((params: ParamMap) => this.articleService.getArticle(params.get('name')))
.subscribe(article => this.article = article);
}
HTML:
<a href="" class="post-cat text-uppercase">{{ article.category }}</a>
Сообщения (статья, как я ее назвал), безусловно, присутствуют и, безусловно, читаются из кеша в порядке.
Кроме того, хотя я получаю сообщение об ошибке, страница на самом деле отображает правильную статью (я могу подтвердить, что статья должна быть правильно изъята из-за этого), поэтому я чувствую, что она пытается получить доступ к объекту статьи до ее заполнения, я думал, что угловой будет это?
Моя ошибка:
ERROR TypeError: Невозможно прочитать свойство "категория" неопределенного объекта Object.eval [как updateRenderer] (PostComponent.html: 4) в Object.debugUpdateRenderer [как updateRenderer] (core.es5.js? De3d: 13105) в checkAndUpdateView (ядро. es5.js? de3d: 12256) в callViewAction (core.es5.js? de3d: 12599) в execComponentViewsAction (core.es5.js? de3d: 12531) в checkAndUpdateView (core.es5.js? de3d: 12257) при вызовеViewAction ( core.es5.js? de3d: 12599) в execComponentViewsAction (core.es5.js? de3d: 12531) в checkAndUpdateView (core.es5.js? de3d: 12257) в callViewAction (core.es5.js? de3d: 12599)
Попытайтесь использовать оператор elvis ?.
:
<a href="" class="post-cat text-uppercase">{{ article?.category }}</a>
Он получит доступ к свойству category
только в том случае, если article
определена.
[routerLink]="['/my-url', article?.slug]"
то произойдет сбой, поскольку вы не можете предоставить нулевое значение для routerLink
*ngIf
ко всему контейнеру, к которому вы *ngIf
к этой переменной, и, если он недоступен, показать какой-нибудь загрузчик.
Попробуйте вот так:
используйте метод then()
вместо subscribe()
service.ts
articles: Promise<Article[]>;
/**
* fetch a list of articles
*/
getArticles(): Promise<Article[]> {
// cached articles
if (this.articles) {
return this.articles;
}
// no articles fetched yet, go get!
return this.articles = this.http.get(this.url, this.options)
.toPromise()
.then((response) => response.json())
.catch(this.handleError);
}
/**
* fetch a single article by url slug
* @param slug
*/
getArticle(slug: string): Promise<Article> {
return this.getArticles()
.then(articles => articles.find(article => article.slug == slug));
}
component.ts
getArticle(): void {
this.route.paramMap.switchMap((params: ParamMap) => {
this.articleService.getArticle(params.get('name'))
.then(result => {
console.log('result', result);
this.article = result
});
})
}
map()
в методе http, вы также можете использовать подписку, но здесь он использует then()
в вызове http
.toPromise()
? во-вторых, почему выreturn this.articles = this.http...
вместоreturn this.http....
?