【发布时间】:2019-02-03 17:10:45
【问题描述】:
还有一个问题,我不知道该怎么办。 我认为问题在于组件的生命周期,但不知道如何解决它。
articles-list.components.ts
export class ArticlesListComponent implements OnInit {
constructor(private articleService: ArticleService) {
}
@Input() articlesList;
articleInfo: IArticleInfoArray;
articlesTitles: string[];
allArticlesInfo: any[] = [];
averageLength: number;
static getUrlInfo(searchQuery: string) {
return 'https://ru.wikipedia.org/w/api.php?action=query&titles='
+ searchQuery + '&prop=info&format=json&origin=*';
}
ngOnInit() {
}
getArticlesTitle() {
this.articlesTitles = this.articlesList[1];
}
getArticlesInfo() {
for (const title of this.articlesTitles) {
this.articleService.getArticlesInfo(ArticlesListComponent.getUrlInfo(title))
.subscribe(
(data: IArticleInfo) => {
this.articleInfo = {
...data,
query: {
pages: [Object.values(data.query.pages)[0]]
}
};
this.allArticlesInfo.push([this.articleInfo.query.pages[0].touched, this.articleInfo.query.pages[0].length]);
}
);
}
}
getAverageLength() {
let sum = 0;
for (const length of this.allArticlesInfo) {
sum += length[1];
}
this.averageLength = sum / this.allArticlesInfo.length;
}
}
articles-list.component.html
<div class="articles-list pt-2" *ngIf="articlesList">
<div class="ml-2">
<h4>По запросу <small class="text-muted query">"{{ articlesList[0] }}"</small>
найдены статьи:</h4>
<h6>Количество найденных статей: {{ articlesList[1].length }}</h6>
</div>
<div class="articles-list__block" *ngFor="let article of articlesList[1]; let i = index">
<div *ngFor="let link of articlesList[3]; let k = index" [hidden]="i != k">
<a class="articles-list__link" [attr.href]="link">{{ article }}</a>
</div>
<div class="articles-list__description mt-2 mb-2" *ngFor="let description of articlesList[2]; let j = index" [hidden]="i != j">
<div *ngIf="description !== ''; else missingSnippet">{{ description }}</div>
<ng-template #missingSnippet>Краткое описание отсутствует</ng-template>
</div>
</div>
</div>
<div *ngIf="articlesList">
<button type="button" class="btn btn-info btn-sm"
(click)="getArticlesTitle(); getArticlesInfo(); getAverageLength()">Дополнительная информация</button>
<ng-container *ngIf="averageLength">
{{ averageLength }}
</ng-container>
</div>
问题是averageLength的值只有在按下第二个按钮后才会出现。
我尝试在方法ngOnInit中使用函数getArticlesTitle(); getArticlesInfo();,但是之后会出现错误Cannot read property '1' of undefined
我该怎么办?组件初始化时如何立即获取值averageLength?
【问题讨论】:
-
因为您在单击按钮时执行所有操作。您正在调用函数,然后数据来并分配给变量。在调用函数 getAverageLength() 之前,averageLength 是未定义的。此外,this.articlesTitles = this.articlesList[1]。您正在尝试访问列表中的项目,但列表中没有项目。所以索引 1 中的值是未定义的
-
@SadidKhan 如何解决?重建界面?
-
这个按钮有什么用?你想要什么?您可以创建一个堆栈闪电战,以便其他人可以轻松找到问题所在吗?这个按钮有什么作用?单击按钮后是否要从服务器获取数据?
-
@SadidKhan 我想按下按钮后显示变量
averageLength的值 -
@SadidKhan stackblitz
标签: angular typescript lifecycle