Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvidas iniciais

As afirmações abaixo estão corretas?

1- No arquivo photo.component.html nós criamos a tag .

<img class="img-thumbnail" [src]="url" [alt]="description">

2- No photo.componente.ts criamos uma classe Photo que por convenção deve ter o nome PhotoComponent. Essa classe define um objeto foto.

import { Component, Input } from "@angular/core";

@Component({
    selector: 'ap-photo',
    templateUrl: 'photo.component.html',

})
export class PhotoComponent {
    @Input() description = '';
    @Input() url = '';
}

3- O arquivo app.component.ts é como se fosse o método main (?), mas o que não estou entendendo é por que o array photos não é do tipo PhotoComponent?

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  photos = [
    {
      url: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sultan_the_Barbary_Lion.jpg/440px-Sultan_the_Barbary_Lion.jpg',
      description: 'Leão'
    },
    {
      url: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Lioness_Etosha_NP.jpg/500px-Lioness_Etosha_NP.jpg',
      description: 'Leoa'
    }
  ];

}

4 -Esse array de photos não poderia ser algo como

photos: PhotoComponent = []

5- Outra dúvida é: no arquivo photo.component.ts fizemos o data-binding e no app.componente.html também. Isso quer dizer que se não faço data-binding no primeiro ele vai ler a string "url", e no segundo vai ler "photo.url" (?), conforme abaixo:

//photo.component.html
<img class="img-thumbnail" [src]="url" [alt]="description">
//app.component.ts
<ap-photo *ngFor="let photo of photos" [url]="photo.url" [description]="photo.description"></ap-photo>

3 respostas

Boa tarde. Respondendo suas perguntas:

3- O arquivo app.component.ts é como se fosse o método main (?), mas o que não estou entendendo é por que o array photos não é do tipo PhotoComponent?

Main? Talvez você esteja fazendo alusão a outra linguagem de programação. A qual linguagem você esta se referindo? No máximo, você pode dizer que o componente é um controller...recebe ações, renderiza view, recebe dados, etc.

O array não é do tipo PhotoComponent por dois motivos. O primeiro é que ainda não entrei na questão de tipagem dos tipos. O tipo que esta sendo usado pelo TypeScript é o tipo any (você fez os cursos pré-requisitos de TypeScript? Se não fez apanhará horrores neste curso de Angular que depende do conhecimento de TypeScript). Segundo, porque uma coisa é ser um componente e outra coisa é ser um tipo de dados, um modelo. Lá na frente você criará um tipo específico chamado Photo e tipará esse array. Sendo assim, sua preocupação de tipar o array é válida, só não faremos agora :)

Respondendo a quinta pergunta

//photo.component.html
<img class="img-thumbnail" [src]="url" [alt]="description">

Neste código, o template do componente esta lendo das propriedades url e description do próprio componente para buscar os dados de quem precisa. Mas como PhotoComponent recebe esses dados? Recebe via Inbound Property como explico no curso. Veja:

<ap-photo *ngFor="let photo of photos" [url]="photo.url" [description]="photo.description"></ap-photo>

Com a diretiva ngFor, estamos criado um PhotoComponent no template de AppComponentpara cada item do array. Dai, para cada item, precisamos passar o valor de photo.url e photo.description para dentro de cada PhotoComponent. Par isso, fazemos [url]="photo.url" e [description]="photo.description". É a partir desse data binding que os dados de cada foto do array são passados para dentro do componente e caindo no componente são passados para seu template,. Agora, se você tivesse feito sem os colchetes, por exemplo:

<ap-photo *ngFor="let photo of photos" url="photo.url" description="photo.description"></ap-photo>

O angular não fará data binding e os valores passados para as inbound properties do componente PhotoComponent url e description serão o texto photo.url e photo.description, o texto e não o valor da expressão.

Espero ter ajudado.

3a- eu quis dizer que a classe AppComponent é a classe principal, ou o controlador principal.

Acho que você entendeu apenas parte da minha dúvida. Mas pensando um pouco vamos ver se eu entendi:

Eu sei que no PhotoComponent eu tenho um seletor que aponta para a tag (o nome correto é diretiva, certo?), o que eu não conseguia compreender era como o let photo of photos apontava para o array photos em AppComponent. Mas agora percebe que o nome dos arquivos são iguais, mudando apenas a extensão, o primeiro .html e o segundo .ts. Logo, deve ser essa a relação. Ou seja, deve ser assim que a diretiva *ngFor consegue enxergar o array photos. É isso?

Quanto ao data-binding eu entendi, só questionei a redundância. Não vejo vantagem em criar uma pseudo tag img (ap-photo), sendo que tenho que repetir praticamente tudo em outro lugar. Mas entendo que devem ser regras da linguagem.

Bom, o meu objetivo é aprender Ionic, mas parece que vou ter que voltar para o TypeScript antes.

solução!

A diretiva ngFor consegue enxergar o array photos no componente porque foi usado exatamente este nome como propriedade em AppComponent.

Sucesso e bom estudo.