Coder Social home page Coder Social logo

enyus / dio-angular-blog Goto Github PK

View Code? Open in Web Editor NEW
0.0 1.0 0.0 21.01 MB

Lab Project da DIO para o Santander Bootcamp 2023 FullStack Java + Angular.

Home Page: https://dio-angular-blog-rho.vercel.app/

License: MIT License

TypeScript 44.49% HTML 13.26% CSS 42.25%
angular dio dio-bootcamp dio-challenges fullstack santander-bootcamp typescript

dio-angular-blog's Introduction

Dio Lab - Blog com Angular

Lab Project da DIO para o Santander Bootcamp 2023 FullStack Java + Angular.

The Blog design

Inspiração

Ironicamente, achei o mesmo exemplo de Blog que o expert Felipe usou na descrição do desafio, mas achei no Figma Community, um design de Faqih Sopyan.

Objetivo

Meu objetivo inicial (ainda estou terminando as aulas de Angular) é construir um blog que me ajude a criar um "cheat-sheet", um resumo de informações úteis, sobre o Angular.

Links

Para rodar o projeto

  • Garanta que você tem o node e o git instalado em sua máquina;
  • Faça o clone do projeto com git clone https://github.com/Enyus/dio-angular-blog.git;
  • Entre na pasta DIO_Angular_Blog com cd .\DIO_Angular_Blog\ e instale as dependências com npm install;
  • Se não tiver o Angular CLI instalado na sua máquina, instale-o globalmente com o código npm install -g @angular/cli
  • Rode a aplicação com ng serve. O app será executado na porta http://localhost:4200/.

Para o Futuro

Como o bootcamp tem data para terminar, resolvi fazer apenas um esqueleto do blog, mas tenho a intenção de criar páginas ou dialogs para os posts para criar um meio facilitado (especialmente pra mim) de encontrar um resumo do que foi aprendido em relação ao Angular.

Consumindo uma API com Angular

Tive uma dificuldade inicial para consumir a API criada em outro desafio do bootcamp, até porque não lembro se o bootcamp envolveu essa funcionalidade do Angular. Então, encontrei este vídeo que ensina usar o HttpClient nativo do próprio Angular para o consumo de APIs.

Criando uma service

É uma boa prática separar qualquer código que não se refira ao comportamento e design de um componente em uma service. O Angular CLI permite a criação da service com o comando ng g s <nome do arquivo>.


Para injetar a service no componente, deve-se criar um construtor para o componente com um parâmetro do tipo do service a ser injetado:

import { PostService } from './service/post.service';

// demais códigos do Componente

export class AppComponent {
  constructor(private postService:PostService) {}
}

Para usar o HttpClient na service, ele deve ser importado e declarado no construtor da mesma:

import { HttpClient } from '@angular/common/http'

// demais códigos da Service

export class PostService {
  constructor(private httpClient:HttpClient) { }
}

Também, deve-se incluir a importação do módulo HttpClient em app.module.ts, para deixá-lo disponível à aplicação:

// app.module.ts:
import { HttpClientModule } from '@angular/common/http';
// demais importações
@NgModule({
  declarations: [
    //declarações
  ],
  imports: [
    //demais importações de módulos
    HttpClientModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}

O HttpClient tem diversos métodos que representam os métodos HTTP mais comuns, como GET, POST, PUT e DELETE:

Métodos do httpclient

Assim, como no caso, eu gostaria de invocar a API para pegar os posts do blog, criei o método obterTodos em post.service.ts:

export class PostService {

  constructor(private httpClient:HttpClient) {}

  obterTodos(){
    return this.httpClient.get(`${API_URL}/posts`)
  }
}

O método .get do HttpClient exige que a url do endpoint a ser consultado seja passado como parâmetro. Como boa prática, não é recomendado passar a url de uma API diretamente no código. Ao invés disso, é melhor passá-la como uma variável de ambiente. No vídeo, a criação do projeto Angular (não sei qual versão estava usando) já criava um arquivo environment.ts, o que não aconteceu no meu caso (Angular 16). Assim, depois de ler este artigo descobri que é possível criar tal arquivo pelo CLI através do comando ng g environments. É notável, ainda, que a variável de ambiente deverá ser importada no serviço:

// post.service.ts
import { API_URL } from 'src/environments/environment';
// demais códigos

Todos os métodos do HttpClient retornam um Observable, que é algo que ainda não estudei e, prevendo isso até, o vídeo menciona que o retorno deve ocorrer pelo método adicional .toPromise(), para retornar uma Promise comum. No entanto .toPromise() foi depreciado e, depois de ler este artigo, descobri que o novo modo de fazer é usando a função firstValueFrom, a ser importado de rxjs:

// post.service.ts
import { firstValueFrom } from 'rxjs';
// demais códigos
obterTodos(){
    return firstValueFrom(this.httpClient.get(`${API_URL}/posts`));
}

No entanto, a promise retornada seria do tipo Promise<Object>, que é o padrão e contraprodutivo no uso do Typescript, assim, é possível determinar qual o tipo de objeto que será retornado ao declarar o método .get com o descritor .get<Post[]>, uma vez que se espera que a API retorne um array de objetos do tipo Post (já modelado em /model/Post.ts):

// post.service.ts
import { firstValueFrom } from 'rxjs';
// demais códigos
obterTodos(){
    return firstValueFrom(this.httpClient.get<Post[]>(`${API_URL}/posts`));
}

Agora, no componente, deve ser criado um método que acionará a API através do serviço:

// app.component.ts
// importações
export class AppComponent {
    // demais códigos do componente
    obterPosts(){
        this.postService.obterTodos()
            .then(res => this.posts = res)
            .catch(console.error);
    }
}

Como, no meu caso, quero que a API seja consultada assim que a aplicação abrir, simplesmente chamei a função obterPosts dentro do construtor de app.component.ts:

// app.component.ts
// importações
export class AppComponent {
    // demais códigos do componente
    constructor(private postService:PostService) {
        this.obterPosts();
    }

    obterPosts(){
        this.postService.obterTodos()
            .then(res => this.posts = res)
            .catch(console.error);
    }
}

E funcionou:

Pontos interessantes

  • Num arquivo de estilo de um componente Angular, se pode usar o seletor CSS :host que selecionará o componente como um todo, se tornando desnecessário criar uma div pai para o componente.

dio-angular-blog's People

Contributors

enyus avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.