sma*_*use 5 arrays json object ngfor angular
我试图从JSON文件中获取数据来构建表单.
这是我模板的一部分:
<div class="form-group">
<label for="power">Power</label>
<select class="form-control" id="power" required>
<option *ngFor="let p of heroes" [value]="p.level">{{p.level}}</option>
</select>
</div>
Run Code Online (Sandbox Code Playgroud)
这是远程JSON文件的一部分:
{
"data": [
{
"level": "newbie",
"places": [
{
"place": "earth",
"categories": [
{
"category": "human",
"values": [
...
Run Code Online (Sandbox Code Playgroud)
它没有问题,我newbie在select菜单中得到了其他选择.但我想在地方循环,所以我用这种方式编辑html模板:
<div class="form-group">
<label for="power">Power</label>
<select class="form-control" id="power" required>
<option *ngFor="let p of heroes[0].places" [value]="p.place">{{p.place}}</option>
</select>
</div>
Run Code Online (Sandbox Code Playgroud)
这是我用来从JSON文件中获取数据的服务:
@Injectable()
export class HeroService {
private url = 'app/mockups/heroes.json';
constructor(private http: Http) { }
getHeroes(): Promise<Hero[]> {
return this.http.get(this.url)
.toPromise()
.then(response => response.json().data as Hero[])
.catch();
}
}
Run Code Online (Sandbox Code Playgroud)
这是hero.component:
export class HeroComponent implements OnInit {
heroes: Hero[];
constructor(private heroService: HeroService) { }
ngOnInit():void {
this.getHeroes();
}
getHeroes(): void {
this.heroService.getHeroes().then(heroes => this.heroes = heroes);
}
Run Code Online (Sandbox Code Playgroud)
但我得到"无法读取属性'0'未定义"错误.
为什么?
Gün*_*uer 12
我猜你想要的是什么
*ngFor="let p of heroes?.data"
Run Code Online (Sandbox Code Playgroud)
因为它heroes似乎是一个对象,并且ngFor只能迭代数组.该level属性也位于数组项中.
我解决了这个问题。我收到此错误是因为我正在异步获取数据,并且当 Angular 尝试解析绑定时,第一次数据仍然为空,因此heroes[0]失败。
所以我解决了初始化heroes数组并使用“Elvis operator”的问题:
heroes: Hero[];而不是heroes: Hero[] = [];在组件中。
heroes[0]?.places而不是heroes[0].places在 html 模板中。