No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

*ngFor para arrays

13/22
Recursos

⚠️ En el código de la clase dice *ngFor Objs, y debería ser *ngFor para arrays.

Puedes utilizar *ngFor para iterar y mostrar cada propiedad de un objeto. Considera que en el componente tienes un array de objetos que representan a una persona:

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  peopleArray = [
    {
        firstname: 'Freddy',
        lastname: 'Vega',
        age: 35
    },
    {
        firstname: 'Nicolas',
        lastname: 'Molina',
        age: 29
    },
    {
        firstname: 'Ángela',
        lastname: 'Ocando',
        age: 30
    }
  ];
}

Itera este array en el HTML e imprimimos el valor de cada propiedad de la siguiente manera:

<ul *ngFor="let person of peopleArray">
    <li>Nombre: {{ person.firstname }}</li>
    <li>Apellido: {{ person.lastname }}</li>
    <li>Edad: {{ person.age }}</li>
</ul>

La variable person guarda temporalmente el objeto en cada iteración, pudiendo acceder a cada valor usando un punto seguido del nombre de la propiedad.


Tipado de objetos con interfaces

El array peopleArray puede contener cualquier cosa, y puede ocasionar comportamientos indeseados en tu aplicación. Puedes crear una interfaz de Personas para tipar los objetos del array y asegurar que todos tengas las mismas propiedades.

interface Person {
    firstname: string;
    lastname: string;
    age: number
}

Tipando el array de la siguiente manera para indicar que el array es de objetos del tipo Persona:

...
peopleArray: Person[] = [
    {
        firstname: 'Freddy',
        lastname: 'Vega',
        age: 35
    },
    ...
 ]

Aporte creado por: Kevin Fiorentino.

Aportes 30

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

El array del profe

products = [
    {
      name: 'EL mejor juguete',
      price: 565,
      image: './assets/images/toy.jpg',
      category: 'all',
    },
    {
      name: 'Bicicleta casi nueva',
      price: 356,
      image: './assets/images/bike.jpg'
    },
    {
      name: 'Colleción de albumnes',
      price: 34,
      image: './assets/images/album.jpg'
    },
    {
      name: 'Mis libros',
      price: 23,
      image: './assets/images/books.jpg'
    },
    {
      name: 'Casa para perro',
      price: 34,
      image: './assets/images/house.jpg'
    },
    {
      name: 'Gafas',
      price: 3434,
      image: './assets/images/glasses.jpg'
    }
  ]

Aquí dejo el array de productos con las imágenes por url, así no hay que descárgalas ni nada, más rápido

  products = [
    {
      name: 'EL mejor juguete',
      price: 565,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/toy.jpg',
      category: 'all',
    },
    {
      name: 'Bicicleta casi nueva',
      price: 356,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/bike.jpg'
    },
    {
      name: 'Colleción de albumnes',
      price: 34,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/album.jpg'
    },
    {
      name: 'Mis libros',
      price: 23,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/books.jpg'
    },
    {
      name: 'Casa para perro',
      price: 34,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/house.jpg'
    },
    {
      name: 'Gafas',
      price: 3434,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/glasses.jpg'
    }
  ]

Las imágenes de Nicolas




Tambien puedes iterar objetos no solo arrays

  products = {nombre:'juanito',edad:20}

<div>
  <div *ngFor="let item of products | keyvalue ">

    {{item.key}}:{{item.value}}

  </div>
</div>

https://source.unsplash.com/random
para que usen imágenes random y no estén descargando (al final ahorita no importa tanto las imágenes

No me lo tomen a mal pero comienzo a amar a este profe, es muy bueno y estoy aprendiendo mucho.

Interfaces de typescript
Una interfaz es un modelo que nos indica los atributos de un objeto.

![](
![](
![](
![](

Yo realice mi ejercicio con elementos de papeleria y coloque la imagen mas pequeña 😃

No hay permisos para bajar las imagenes, por fa anteriormente agregaban una pestaña de recursos y ahi compartian los archivos o si lo van a ser por git que sea publico

Cuando hice el ejercicio, tenía corriendo el servidor, puse las imágenes y no me las mostraba, tuve que parar el servidor y volverlo a iniciar para que cargar lo que había en assets.

Buenas, considero que el nombre de la clase debe ser “*ngFor para arrays de objetos” jeje, porque en clase anterior, ya se explicó el tema con un array.

ngFor para arrays

Ya vimos como iterar valores primitivos como strings, numbers, booleans. Pero ahora veremos como iterar array con una structura mas compleja, como lo son los arrays de objetos.

Pasos

1 - Primero debemos tener un array de objetos. Yo usare uno de estudiantes:

students = [
    {
      firstName: 'German',
      lastName: 'Pinilla',
      age: 28,
      isStudent: true,
      image: '../assets/img/img01.jpg',
      category: '',
    },
    {
      firstName: 'Andres',
      lastName: 'Rios',
      age: 30,
      isStudent: true,
      image: '../assets/img/img02.jpg',
    },
    {
      firstName: 'Carlos',
      lastName: 'Diaz',
      age: 26,
      isStudent: false,
      image: '../assets/img/img03.jpg',
    },
    {
      firstName: 'Ricardo',
      lastName: 'Rodriguez',
      age: 26,
      isStudent: true,
      image: '../assets/img/img02.jpg',
    },
    {
      firstName: 'Luis',
      lastName: 'Garcia',
      age: 29,
      isStudent: false,
      image: '../assets/img/img03.jpg',
    },
    {
      firstName: 'Adriana',
      lastName: 'Smith',
      age: 29,
      isStudent: true,
      image: '../assets/img/img04.jpg',
    },
  ];

Este array contiene por cada posicion en el array, un elemento de tipo
objeto, que a su ves contiene unas propiedades (firstName, lastName, age, etc)

2 - Podemos iterar este array de objetos y obtener cada unas de sus propiedades

<div>
  <!-- Iteramos el array students y definimos para cade elemento la variable student -->
  <div *ngFor="let student of students">
    <!-- Cada elemento student contiene las propiedades del objeto por lo que podemos
    istanciarlas con punto elmento.propiedad -->
    <!-- student.image contiene la url de la imagen -->
    <img [src]="student?.image" width="200" style="border-radius: 50%;" alt="image">&nbsp;
    <br>
    <label>Nombre: </label>
    <span>
    <!-- student.firstName contiene el nombre del estudiante y 
    student.lastName contiene el apellido del estudiante -->
      {{ student?.firstName + ' ' + student.lastName }}
    </span>
    <br>
    <label>Edad: </label>
    <!-- student.age contiene la edad del estudiante -->
    <span>{{ student?.age }}</span>
    <br>
    <label>Es estudiante?: </label>
    <!-- student.isStudent contiene la validacion booleana 
    si el usuario es estudiante o no -->
    <span>{{ student?.isStudent ? 'Si es estudiante' : 'No es estudiante' }}</span>
    <hr>
  </div>
</div>

3 - Una forma mas deductiva de conocer las propiedades del array de objetos, es definiendo
una interface donde se declaran cada una de sus propiedades y el tipo de dato que contendra

Nota: Puedo definir la interface en mi propio componente pero es recomendable hacerlo en
un archivo independiente (Como lo hizo el profe), si lo defino el mismo app.component.ts
no es necesario usar export, de otra forma si debo usarlo para luego imporatala interface
en los lugares que lo desee.

export interface Student {
    firstName: string;
    lastName: string;
    age: number;
    isStudent: boolean;
    image: string;
    category?: string;
}

Una vez tenemos a interface en un archivo independiente la importamos en nuestro componente
y definimos el array de objetos students de tipo student heredando las propiedades de la
interface.

import { Component } from '@angular/core';
import { Student } from './student.model'; // <--- Aqui impotamos la interface

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {

// Defnimos el array de objetos del tipo Student[]
  students: Student[] = [ 
    {
      firstName: 'German',
      lastName: 'Pinilla',
      age: 28,
      isStudent: true,
      image: '../assets/img/img01.jpg',
      category: '',
    },
    {
      firstName: 'Andres',
      lastName: 'Rios',
      age: 30,
      isStudent: true,
      image: '../assets/img/img02.jpg',
    },
    {
      firstName: 'Carlos',
      lastName: 'Diaz',
      age: 26,
      isStudent: false,
      image: '../assets/img/img03.jpg',
    },
    {
      firstName: 'Ricardo',
      lastName: 'Rodriguez',
      age: 26,
      isStudent: true,
      image: '../assets/img/img02.jpg',
    },
    {
      firstName: 'Luis',
      lastName: 'Garcia',
      age: 29,
      isStudent: false,
      image: '../assets/img/img03.jpg',
    },
    {
      firstName: 'Adriana',
      lastName: 'Smith',
      age: 29,
      isStudent: true,
      image: '../assets/img/img04.jpg',
    },
  ];

}

Aca la respuesta en el navegador:

Si necesitan imagenes y no las quieren descrgar las pueden encontrar de estas páginas: <https://www.pexels.com/es-es/> <https://pixabay.com/es/> Copian la url de la imgen y listo. ```js productos = [ {name: 'Laptop1', preci: 500, img:'https://images.pexels.com/photos/7974/pexels-photo.jpg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1'}, {name: 'Laptop2', preci: 600, img:'https://images.pexels.com/photos/205421/pexels-photo-205421.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1'}, ] ```productos = \[    {name: 'Laptop1', preci: 500, img:'https://images.pexels.com/photos/7974/pexels-photo.jpg?auto=compress\&cs=tinysrgb\&w=1260\&h=750\&dpr=1'},    {name: 'Laptop2', preci: 600, img:'https://images.pexels.com/photos/205421/pexels-photo-205421.jpeg?auto=compress\&cs=tinysrgb\&w=1260\&h=750\&dpr=1'},  ]

Ventajas de tiempos modernos, vas a chat gpt3 y le pides que te genere un array de 6 productos con las características que quieras y listo bendito Drs Chat GPT 3

Mi avance:

<table border="1" [cellPadding]="padding">
    <thead>
        <tr>
            <th>Nombre</th>
            <th>Precio</th>
            <th>Imagen</th>
            <th>Categoria</th>
        </tr>
    </thead>
    <tbody>
        <tr *ngFor="let item of products; index as i">
            <td>{{item.name}}</td>
            <td align="right">${{item.price}}</td>
            <td>
                <img [src]="item.image" alt="{{item.name}}" width="100">
            </td>
            <td>{{item.category}}</td>
        </tr>
    </tbody>
</table>

products = [
    {
      name: 'EL mejor juguete',
      price: 565,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/toy.jpg',
      category: 'all',
    },
    {
      name: 'Bicicleta casi nueva',
      price: 356,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/bike.jpg'
    },
    {
      name: 'Colleción de albumnes',
      price: 34,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/album.jpg'
    },
    {
      name: 'Mis libros',
      price: 23,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/books.jpg'
    },
    {
      name: 'Casa para perro',
      price: 34,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/house.jpg'
    },
    {
      name: 'Gafas',
      price: 3434,
      image: 'https://raw.githubusercontent.com/platzi/angular-fundamentals/10-step/src/assets/images/glasses.jpg'
    }
  ]

Metodo extra para subir el padding:

padding = 0;

  addPading() {
    this.padding = this.padding + 5
  }

Comienzo del Tema de Interfaces en Angular

aqui les dejo un array de objetos con mi team de pokemons en Pokemon purpura, para que practiquen armando el suyo:

  pokemonTeam: Pokemon[] = [
    {
      name: 'meowscarada',
      level: 91,
      image: 'https://img.pokemondb.net/sprites/scarlet-violet/normal/meowscarada.png',
      category: 'starter',

    },
    {
      name: 'tinkaton',
      level: 70,
      image: 'https://img.pokemondb.net/sprites/scarlet-violet/normal/tinkaton.png',
      category: 'captured'
    },
    {
      name: 'vespiquen',
      level: 65,
      image: 'https://img.pokemondb.net/sprites/scarlet-violet/normal/vespiquen.png',
      category: 'captured'

    },
    {
      name: 'clodsire',
      level: 72,
      image: 'https://img.pokemondb.net/sprites/scarlet-violet/normal/clodsire.png',
      category: 'captured'

    },
    {
      name: 'golduck',
      level: 68,
      image: 'https://img.pokemondb.net/sprites/scarlet-violet/normal/golduck.png',
      category: 'captured'

    },
    {
      name: 'talonflame',
      level: 73,
      image: 'https://img.pokemondb.net/sprites/scarlet-violet/normal/talonflame.png',
      category: 'captured'
    }
  ]

les dejo la pagina para sacar los sprites para sus propios pokemon, saludos!

https://pokemondb.net/sprites

Aca en mis practicas, lo que hice fue desglosar los partidos politicos actuales de Mexico. Disculpen el zoom porque le coloque mucho texto.

Para las fotos utilice lorem picsum

https://picsum.photos/200/300
        {
          name: 'EL mejor juguete',
          price: 565,
          image: 'https://picsum.photos/200/300',
          category: 'all',
        },

Les dejo el recurso que se vio en el curso de typescript que nos funciona para hacer el typado de un Json de forma automatica

https://app.quicktype.io/

en este caso, para el array que compartio el compañero @Rony Porraz, utilize este código para transformarlo a JSON

const myJSON = JSON.stringify(products);
console.log(myJSON);

y me regreso el JSON para cargarlo en quicktype, dandome exactamente el mismo código que el profeso escribió en la interface

export interface Product {
    name:      string;
    price:     number;
    image:     string;
    category?: string;
}

<h1>*ngFor Array</h1>
<div>
  <div *ngFor="let product of products">
    <img width="250" [src]="product.image" alt="image">
    <h2>{{product.price}}</h2>
    <p>{{product.name}}</p>
  </div>
</div>
<h1>*ngFor Object</h1>
<div>
  <div *ngFor="let item of person | keyvalue">
    {{item.key}}:{{item.value}}
  </div>
</div>

Para descargar las imágenes con GIT, seguir los siguientes pasos:

  1. ir a https://github.com/platzi/angular-fundamentals/tree/10-step
  2. git clone https://github.com/platzi/angular-fundamentals.git
  3. git checkout 10-step

Esto en caso de que descarguen el archivo y no les aparezca la carpeta de imagenes.

productos = [
{
name: ‘Grogu The Mandalorian’,
price: 75000,
image: ‘./assets/images/grogu.jpg’,
category: ‘all’,
},
{
name: ‘Bicicleta madera’,
price: 175000,
image: ‘./assets/images/bici.jpg’
},
{
name: ‘Libros’,
price: 80000,
image: ‘./assets/images/libros.jpg’
},
{
name: ‘Casa para perro’,
price: 250000,
image: ‘./assets/images/casaperro.jpg’
},
{
name: ‘Gafas’,
price: 98000,
image: ‘./assets/images/gafas.jpg’
}
]

products = [
{
name: ‘MI DUCATI’,
price: ‘$60.000.000’,
image: ‘./assets/imagenes/ducati.png’
},
{
name: ‘MI FERRARI’,
price: ‘1.513 millones de pesos’,
image: ‘./assets/imagenes/ferrari.jpg’
},
{
name: ‘MI HARLEY’,
price: ‘10.240 €’,
image: ‘./assets/imagenes/harley-davidson.png’
},
{
name: ‘MI LAMBORGHINI’,
price: ‘300.000 dólares en Colombia’,
image: ‘./assets/imagenes/lamborghini.jpg’
},
{
name: ‘TESLA’,
price: ‘$255 millones de pesos a la tasa actual’,
image: ‘./assets/imagenes/TESLA.jpg’
},
{
name: ‘YAMAHA’,
price: ‘5.999 €’,
image: ‘./assets/imagenes/Yamaha.jpg’
}

]

no puedes poner *ngIf y *ngFor en el mismo elemento. Prueba a poner la sentencia *ngIf en el select, y el *ngFor en los option. Resumiendo, serían select diferentes según la selección previa, en vez de opciones diferentes.

<div class="form-group">
  <label for="estado">Estado</label><br>
  <select
    required
    formControlName="estado"
    name="estado"
    class="form-control selectbox"
    #paisSel>
    <option value="">
      Selecciona tu Estado
    </option>
    <option *ngFor="let estado of estados" [value]="estado.key">
        {{estado.nombre}}
    </option>
  </select>
</div>
export class Tiendas {

  public ags:   string[];
  public bc:    string[];

  constructor() {
    this.ags   = [
      'Texto',
      'De'
    ];
    this.bc    = [
      'Ejemplo',
      '...'
    ];
  }
}