arraysangular

Angular 8 ngFor not binding


I have the League of Legends Champion API witch returns what I'm getting from the champions.service.

.ts

    
    @Component({   selector: 'app-champions',   templateUrl: './champions.component.html',   styleUrls: ['./champions.component.css'] })
    
    export class ChampionsComponent implements OnInit {
    
      public champions;   
      public arrayChampions;  
      
         constructor(private championsService:ChampionsService) { }
    
      ngOnInit(): void {
        this.getAllChampions();   }
    
     getAllChampions(){
    this.championsService.getChampions().subscribe(
      data => { this.champions = data, 
        this.arrayChampions = Object.entries(this.champions.data).map(([k,v]) => ({ [k]:v })),
        this.ArrayIterator(); 
      },
      err => {console.error(err)},
      () => console.log("Champions cargados")
    );
  }

  ArrayIterator() {
    let IteratableArray = Array();
    for (let item of Object.keys(this.arrayChampions[0])) {
      var eventItem = Object.values(this.arrayChampions[0]);
      IteratableArray.push(eventItem);
    }
    this.arrayChampions = IteratableArray[0];
  }
    
    
    }

champions.service

    import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders} from '@angular/common/http';
 
    const httpOptions = {   
     headers: new HttpHeaders({'Content-Type': 'application/json'}) 
    }
 
    @Injectable({   providedIn: 'root' }) export class ChampionsService {
 
    constructor(private http: HttpClient) { }
 
    getChampions(){
     return this.http.get('http://ddragon.leagueoflegends.com/cdn/10.23.1/data/es_ES/champion.json');
    }

HTML:

    <div *ngFor="let arrayChampion of arrayChampions>
        <a class="text-decoration-none">{{arrayChampion.id}}</a>
    </div>

The fact is that nothing appears in the HTML. I don't know really well which is the problem.


Solution

  • Your array first element is an object since because of that you cannot iterate it straightly in the template. Therefore you need to transform it accordingly to be able to iterate over through the template. For that you can proceed with the following :

    From here with I am attaching the working stackblitz example here

    Sample HTML :

    <div *ngFor="let arrayChampion of arrayChampions>
        <a class="text-decoration-none">{{arrayChampion.id}}</a>
    </div>
    

    Sample component.ts :

    import { Component, OnInit } from "@angular/core";
    
    @Component({
      selector: "my-app",
      templateUrl: "./app.component.html",
      styleUrls: ["./app.component.css"]
    })
    export class AppComponent implements OnInit {
      name = "Angular 4";
      arrayChampions: any;
      data = [
        {
          Aatrox: {
            id: "Aatrox",
            key: "266"
          },
          Ahri: {
            id: "Ahri",
            key: "103"
          },
          Akali: {
            id: "Akali",
            key: "84"
          }
        }
      ];
    
      constructor() {}
      ngOnInit() {
        this.ArrayIterator();
      }
    
      ArrayIterator() {
        let IteratableArray = Array();
        for (let item of Object.keys(this.data[0])) {
          var eventItem = Object.values(this.data[0]);
          IteratableArray.push(eventItem);
        }
        this.arrayChampions = IteratableArray[0];
      }
    }