从 LocalStorage 迭代 Angular 9 中的值
Iterating Values in Angular 9 from LocalStorage
我在 Angular 中显示来自 Localstorage 的嵌套值时遇到问题。问题出在第二个 *ngFor 上。第一个 *ngFor 显示良好。第二个 ngFor 有 "TypeError: Cannot read property 'toUpperCase' of undefined" 的错误?我不知道为什么是 toUppercase 因为我在这里没有使用大写
HTML
<mat-list-item role="listitem" *ngFor="let bookmark of bookmarks">
{{ extractNameFromJson(bookmark[1]).id }}
<ul>
<li *ngFor="let extractNameFromJson(bookmark[1])?.cuesData of bookmark">
{{ }}
</li>
</ul>
</mat-list-item>
TS
getAllBookmarks() {
this.bookmarks = Object.entries(localStorage);
console.log(this.bookmarks);
}
extractNameFromJson(obj) {
obj = JSON.parse(obj);
return obj;
}
您需要先获取*ngFor
中每个bookMark的值作为变量。使用 ngFor
从循环中提取变量时不能进行函数调用。一种方法是让 pipe
在循环时为您执行此过滤,或者另一种方法是使用 ng-container
循环并仅在您的条件通过时显示 lis
。
<ng-container *ngFor="let eachBookMark of bookmark">
<ng-container *ngIf="extractNameFromJson(eachBookMark[1]) as data">
<ng-container *ngIf="data.cuesData">
<li *ngFor="data.cuesData">
{{data | json}}
</li>
</ng-container>
</ng-container>
</ng-container>
编辑:
如果您想更改 ts 中的 bookmarks
数组,也许您可以这样做:
this.bookmarks = this.bookmarks.map(([first, second]) => {
return [first, JSON.parse(second)];
});
现在,如果你这样做了,那么你的 HTML 可以很简单:
<mat-list-item role="listitem" *ngFor="let eachBookMark of bookmarks">
<ul>
<ng-container *ngIf="eachBookMark[1].cuesData as cuesData">
<li *ngFor="let eachCue of cuesData">
{{ eachCue.description }}
</li>
</ng-container>
</ul>
</mat-list-item>
编辑2:
this.filteredBookmarks = this.bookmarks.reduce((acc, [first, second]) => {
const parsedOb = JSON.parse(second);
if (parsedOb.cuesData) {
acc.push([first, parsedOb]);
}
return acc;
}, []);
<mat-list-item role="listitem" *ngFor="let eachBookMark of filteredBookmarks">
<ul>
<li *ngFor="let eachCue of cuesData">
{{ eachCue.description }}
</li>
</ul>
</mat-list-item>
所有上述过滤,(map/reduce) 将发生在您填充的地方 bookmarks
。
按要求更新
TS:
getAllBookmarks() {
this.bookmarks = this.extractNameFromJson(Object.entries(localStorage));
console.log(this.bookmarks);
}
extractNameFromJson(obj) {
obj = JSON.parse(obj);
return obj;
}
HTML:
<mat-list-item role="listitem" *ngFor="let bookmark of bookmarks">
{{ bookmark[1].id }}
<ul *ngIf="bookmark[1].cuesData>
<li *ngFor="let cue of bookmark[1].cuesData">
{{ cue.description }}
</li>
</ul>
</mat-list-item>
原答案
第二个*ngFor
语法不正确
根据您发布的内容推断,这就是您所需要的。
更新:增加了功能extractNameFromJson
<ul *ngIf="bookmark[1].cuesData">
<li *ngFor="let cue of extractNameFromJson(bookmark[1].cuesData)">
{{ cue.description }}
</li>
</ul>
假设您需要从屏幕截图中显示description
,您也可以显示startTime
或endTime
。
希望对您有所帮助!
我在 Angular 中显示来自 Localstorage 的嵌套值时遇到问题。问题出在第二个 *ngFor 上。第一个 *ngFor 显示良好。第二个 ngFor 有 "TypeError: Cannot read property 'toUpperCase' of undefined" 的错误?我不知道为什么是 toUppercase 因为我在这里没有使用大写
HTML
<mat-list-item role="listitem" *ngFor="let bookmark of bookmarks">
{{ extractNameFromJson(bookmark[1]).id }}
<ul>
<li *ngFor="let extractNameFromJson(bookmark[1])?.cuesData of bookmark">
{{ }}
</li>
</ul>
</mat-list-item>
TS
getAllBookmarks() {
this.bookmarks = Object.entries(localStorage);
console.log(this.bookmarks);
}
extractNameFromJson(obj) {
obj = JSON.parse(obj);
return obj;
}
您需要先获取*ngFor
中每个bookMark的值作为变量。使用 ngFor
从循环中提取变量时不能进行函数调用。一种方法是让 pipe
在循环时为您执行此过滤,或者另一种方法是使用 ng-container
循环并仅在您的条件通过时显示 lis
。
<ng-container *ngFor="let eachBookMark of bookmark">
<ng-container *ngIf="extractNameFromJson(eachBookMark[1]) as data">
<ng-container *ngIf="data.cuesData">
<li *ngFor="data.cuesData">
{{data | json}}
</li>
</ng-container>
</ng-container>
</ng-container>
编辑:
如果您想更改 ts 中的 bookmarks
数组,也许您可以这样做:
this.bookmarks = this.bookmarks.map(([first, second]) => {
return [first, JSON.parse(second)];
});
现在,如果你这样做了,那么你的 HTML 可以很简单:
<mat-list-item role="listitem" *ngFor="let eachBookMark of bookmarks">
<ul>
<ng-container *ngIf="eachBookMark[1].cuesData as cuesData">
<li *ngFor="let eachCue of cuesData">
{{ eachCue.description }}
</li>
</ng-container>
</ul>
</mat-list-item>
编辑2:
this.filteredBookmarks = this.bookmarks.reduce((acc, [first, second]) => {
const parsedOb = JSON.parse(second);
if (parsedOb.cuesData) {
acc.push([first, parsedOb]);
}
return acc;
}, []);
<mat-list-item role="listitem" *ngFor="let eachBookMark of filteredBookmarks">
<ul>
<li *ngFor="let eachCue of cuesData">
{{ eachCue.description }}
</li>
</ul>
</mat-list-item>
所有上述过滤,(map/reduce) 将发生在您填充的地方 bookmarks
。
按要求更新
TS:
getAllBookmarks() {
this.bookmarks = this.extractNameFromJson(Object.entries(localStorage));
console.log(this.bookmarks);
}
extractNameFromJson(obj) {
obj = JSON.parse(obj);
return obj;
}
HTML:
<mat-list-item role="listitem" *ngFor="let bookmark of bookmarks">
{{ bookmark[1].id }}
<ul *ngIf="bookmark[1].cuesData>
<li *ngFor="let cue of bookmark[1].cuesData">
{{ cue.description }}
</li>
</ul>
</mat-list-item>
原答案
第二个*ngFor
语法不正确
根据您发布的内容推断,这就是您所需要的。
更新:增加了功能extractNameFromJson
<ul *ngIf="bookmark[1].cuesData">
<li *ngFor="let cue of extractNameFromJson(bookmark[1].cuesData)">
{{ cue.description }}
</li>
</ul>
假设您需要从屏幕截图中显示description
,您也可以显示startTime
或endTime
。
希望对您有所帮助!