Melhorando CÓDIGO ANGULAR RUIM em 7 PASSOS

00:29:45
https://www.youtube.com/watch?v=1FaVCZNVLvU

Resumen

TLDRO vídeo apresenta um tutorial sobre como refatorar um código legado em Angular 19, focando em melhorar a legibilidade e a manutenção do código. O apresentador demonstra várias técnicas, como a utilização de NG-container para evitar divs desnecessárias, a criação de componentes reutilizáveis para encapsular a lógica de apresentação, e a implementação de serviços para gerenciar requisições HTTP. Além disso, ele discute a importância da tipagem em TypeScript e como usar signals para gerenciar a reatividade de forma mais eficiente. O vídeo é uma aula prática que ilustra boas práticas de desenvolvimento em Angular, visando a criação de um código mais limpo e organizado.

Para llevar

  • 🔧 Refatoração melhora a legibilidade do código.
  • 📦 Use NG-container para evitar divs desnecessárias.
  • ♻️ Componentes reutilizáveis facilitam a manutenção.
  • 🛠️ Serviços gerenciam requisições HTTP de forma eficiente.
  • 📜 Tipagem em TypeScript aumenta a segurança do código.
  • ⚡ Signals modernizam a reatividade no Angular.
  • 🗑️ Use filter para excluir itens de forma mais simples.
  • 📏 Mantenha o ngOnInit limpo e organizado.
  • 🎨 Aplique estilos diretamente no elemento host.
  • 🚫 Evite lógica complexa em templates.

Cronología

  • 00:00:00 - 00:05:00

    O vídeo aborda a transformação de um código legado em um código mais legível e de fácil manutenção, utilizando um projeto em Angular 19 como exemplo. O apresentador inicia a refatoração do código, destacando a importância de evitar elementos HTML desnecessários, como divs, e sugere o uso de 'ng-container' para melhorar a estrutura do código.

  • 00:05:00 - 00:10:00

    O apresentador continua a refatoração, criando um componente reutilizável para os cards de postagens. Ele demonstra como simplificar a estrutura HTML, removendo divs desnecessárias e aplicando estilos diretamente no elemento host do componente, o que melhora a legibilidade e a manutenção do código.

  • 00:10:00 - 00:15:00

    Após a criação do componente de card, o apresentador discute a importância da tipagem no TypeScript. Ele cria uma interface para os posts, garantindo que as propriedades sejam bem definidas e que o código seja mais robusto e fácil de entender.

  • 00:15:00 - 00:20:00

    O apresentador propõe a criação de um serviço para gerenciar as requisições HTTP, separando a lógica de manipulação de dados da lógica de apresentação. Ele demonstra como criar um serviço para obter e deletar posts, melhorando a organização do código e a reutilização de recursos.

  • 00:20:00 - 00:29:45

    Por fim, o apresentador implementa o uso de 'signals' para gerenciar o estado dos posts, substituindo métodos tradicionais de manipulação de arrays. Ele explica como o uso de 'filter' e 'update' pode simplificar a lógica de exclusão de posts, tornando o código mais eficiente e reativo.

Ver más

Mapa mental

Vídeo de preguntas y respuestas

  • O que é refatoração de código?

    Refatoração de código é o processo de reestruturar um código existente para torná-lo mais legível e fácil de manter, sem alterar seu comportamento externo.

  • Por que usar NG-container?

    NG-container é usado para evitar a criação de elementos HTML desnecessários, ajudando a manter a estrutura do DOM mais limpa.

  • Qual a vantagem de criar componentes reutilizáveis?

    Componentes reutilizáveis facilitam a manutenção e a escalabilidade do código, permitindo que partes do código sejam usadas em diferentes lugares sem duplicação.

  • O que são signals no Angular?

    Signals são uma nova forma de gerenciar reatividade no Angular, permitindo que os desenvolvedores atualizem o estado de forma mais eficiente.

  • Como melhorar a tipagem em TypeScript?

    A tipagem pode ser melhorada definindo interfaces para os dados que estão sendo manipulados, garantindo que o código seja mais seguro e fácil de entender.

  • Qual a função de um serviço em Angular?

    Um serviço em Angular é uma classe que encapsula lógica de negócios e operações de dados, permitindo que diferentes componentes compartilhem funcionalidades.

  • Como usar o método filter em arrays?

    O método filter cria um novo array com todos os elementos que passam no teste implementado pela função fornecida.

  • Por que evitar lógica complexa no ngOnInit?

    Evitar lógica complexa no ngOnInit ajuda a manter o código mais limpo e facilita a leitura e manutenção.

  • Qual a importância de evitar divs desnecessárias?

    Evitar divs desnecessárias ajuda a manter a estrutura do HTML mais limpa e pode prevenir problemas de layout.

  • Como aplicar estilos diretamente no elemento host?

    Estilos podem ser aplicados diretamente no elemento host usando a propriedade :host no CSS do componente.

Ver más resúmenes de vídeos

Obtén acceso instantáneo a resúmenes gratuitos de vídeos de YouTube gracias a la IA.
Subtítulos
pt
Desplazamiento automático:
  • 00:00:00
    No vídeo de hoje, eu quero mostrar como
  • 00:00:01
    você consegue transformar um código
  • 00:00:03
    ruim, mal escrito, legado em um código
  • 00:00:05
    melhor de entender e de manter também,
  • 00:00:08
    tá? Esse tópico foi pedido ali na
  • 00:00:10
    comunidade da CoMension no WhatsApp, no
  • 00:00:12
    Discord e eu vou realizar esse pedido
  • 00:00:14
    hoje. Beleza? Bora lá ver. Então, eu
  • 00:00:17
    criei esse projeto aqui em Angler 19.
  • 00:00:19
    Ele tá com código meio ruinzinho, meio
  • 00:00:21
    fuleiro, tá? Então, eu tenho aqui
  • 00:00:22
    basicamente uma listagem de posts de uma
  • 00:00:25
    API de exemplo, eu consigo deletar e
  • 00:00:28
    tudo mais. Tudo isso daqui é a
  • 00:00:29
    requisição HTTP mesmo, tá? Então,
  • 00:00:31
    basicamente vou fazer aqui a primeira
  • 00:00:34
    refatoração. Dá para ver que o código
  • 00:00:35
    aqui pode ser melhorado, né? Talvez a
  • 00:00:37
    primeira coisa que eu tenha que fazer é
  • 00:00:39
    melhorar isso daqui, ó. Então, a gente
  • 00:00:42
    tem um NG4, né, que dá para usar uma
  • 00:00:44
    control flow syntax aqui com @for e tudo
  • 00:00:48
    mais. Ã, mas eu acho que o primeiro
  • 00:00:50
    ponto é realmente mudar para um NG
  • 00:00:53
    contêiner, caso, sei lá, o projeto não
  • 00:00:55
    tenha suporte a control flow syntax, tá?
  • 00:00:58
    Então, basicamente vim aqui, ó, NG
  • 00:01:01
    contêiner, tá? Opa, contêiner. Eu não
  • 00:01:05
    quero outro elemento, não. Deu, ó, isso
  • 00:01:09
    daqui já renderizou, tá? Dá para ver que
  • 00:01:11
    continua da mesma forma, tá? E a gente
  • 00:01:14
    não cria uma div desnecessária, beleza?
  • 00:01:18
    Ali antes estava criando uma div
  • 00:01:19
    desnecessária, como dava para ver, né?
  • 00:01:22
    Então não é legal porque você acaba
  • 00:01:25
    também quebrando talvez o o layout da
  • 00:01:28
    aplicação, porque também uma div por
  • 00:01:31
    padrão ela tem um display block, né?
  • 00:01:34
    Essa é uma especificação da W3C ali pros
  • 00:01:37
    navegadores. Então a div tem um display
  • 00:01:38
    block, então ela vai quebrar por padrão
  • 00:01:40
    às vezes um contêiner aí flexbox, alguma
  • 00:01:44
    coisa, tá? Então é sempre legal
  • 00:01:47
    você evitar que os loops, né, quando
  • 00:01:50
    usando
  • 00:01:51
    NG4, estejam em cima de um elemento de
  • 00:01:54
    verdade. Sempre trabalhe com NG
  • 00:01:57
    contêiner, tá bom? Por favor, o bagulho
  • 00:02:00
    aqui
  • 00:02:01
    bugou, tá bom? Dessa forma aqui. Mas
  • 00:02:04
    como é que eu tô no Angular 19, eu vou
  • 00:02:06
    usar o contr flow syntax, não sou bobo
  • 00:02:09
    nem nada, né? Então vamos lá, ó. V aqui,
  • 00:02:13
    vou botar o item aqui, botar o outro
  • 00:02:15
    item aqui. E aqui eu sei que é o ID, tá?
  • 00:02:20
    Que vem lá da PI de exemplo. Então vou
  • 00:02:22
    tirar aqui e vou tirar aqui,
  • 00:02:26
    tá? E aqui também. Então vou pedir para
  • 00:02:29
    ele dar uma refatorada aqui, quer dizer,
  • 00:02:31
    dar uma formatada.
  • 00:02:34
    Formata. A formatação ficou meio zoada,
  • 00:02:36
    né? E aqui dá para ver que ele tá
  • 00:02:40
    funcionando normal.
  • 00:02:42
    Deleta. O outro ponto aqui é essa classe
  • 00:02:46
    contêiner aqui. O ponto aqui, na
  • 00:02:48
    verdade, aqui ela tá servindo como se
  • 00:02:50
    fosse uma classe CSS ali host, né, que
  • 00:02:53
    fosse pegar todo o elemento, né, o
  • 00:02:56
    componente, o template do componente,
  • 00:02:58
    mas a gente não precisa dessa div aqui,
  • 00:03:01
    digamos inútil, tá? A gente consegue
  • 00:03:03
    aplicar o estilo diretamente no elemento
  • 00:03:06
    host, que é esse elemento aqui que vai
  • 00:03:09
    ser renderizado aqui, ó. Vou até mostrar
  • 00:03:10
    aqui no HTML. Então, se a gente vem
  • 00:03:13
    aqui, olha só que legal. Tá vendo esse
  • 00:03:15
    app host aqui? Esse daqui é o elemento
  • 00:03:17
    base, né, que a gente tá renderizando
  • 00:03:19
    aqui, ó. Então aqui a gente tá botando
  • 00:03:22
    seletor, tá? Então, ó, basicamente ele
  • 00:03:25
    tá vindo aqui esse cara. Então, a gente
  • 00:03:27
    consegue aplicar um estilo CSS
  • 00:03:29
    diretamente para esse cara. A gente não
  • 00:03:31
    precisaria criar uma
  • 00:03:35
    divl aplicado. Dá para ver que a div tá
  • 00:03:38
    aqui, né? Eu sei que a webcam tá na
  • 00:03:39
    frente, mas ó, contêiner é o CSS ali.
  • 00:03:43
    Tanto é que se eu tirar aqui vai quebrar
  • 00:03:45
    tudo, ó. Já mudou ali, ó. Então, ó,
  • 00:03:48
    vamos tirar essa div e aplicar o CSS
  • 00:03:50
    diretamente nesse cara. E é bem fácil
  • 00:03:52
    isso, tá? E eu vejo que não muitas
  • 00:03:55
    pessoas, né, para não dizer, não vou
  • 00:03:58
    dizer todo mundo, mas muita gente às
  • 00:03:59
    vezes não não se atenta a isso, tá?
  • 00:04:01
    Então, basicamente é pegar, trocar aqui,
  • 00:04:04
    ó, o contêiner pelo host, tá? esse 2.
  • 00:04:07
    Host, ele vai mirar o estilo, né,
  • 00:04:11
    justamente nesse elemento app root que a
  • 00:04:13
    gente tem aqui no dom. E claro, eh
  • 00:04:17
    mudando isso, ele já vai mudar. Só que
  • 00:04:19
    claro, tem uma div aqui bugada que tem
  • 00:04:22
    um display block, como eu falei antes,
  • 00:04:24
    ó. Tem display block por padrão do
  • 00:04:26
    navegador, tá? Div por padrão vem assim.
  • 00:04:28
    Dá para ver que ela não tá pegando
  • 00:04:29
    nenhum estilo, tá? Até porque a classe
  • 00:04:32
    contêiner nem existe mais. E dá para ver
  • 00:04:35
    aqui, ó, que o nosso approot agora tem
  • 00:04:37
    esse estilo, ó, NG host tã, com uma
  • 00:04:40
    classe ali andômica e display flex, tudo
  • 00:04:43
    mais. Todo o estilo que a gente fez tá
  • 00:04:46
    aplicado aqui, tá? Então o que eu vou
  • 00:04:49
    fazer, vou tirar essa
  • 00:04:52
    div. Pronto. Ó, dá para ver que o o
  • 00:04:57
    estilização tá normal, os elementos
  • 00:04:59
    HTMLs aqui e esse cara aqui eu vou tirar
  • 00:05:02
    também, tá? Mas vamos por partes. E dá
  • 00:05:06
    para ver que o card tá normal aqui.
  • 00:05:07
    Então vou tirar aqui. Olha só que legal,
  • 00:05:09
    funcionando normal, tá? Então essa daqui
  • 00:05:12
    é uma forma bem legal de gente aplicar
  • 00:05:14
    uma estilização sem fazer um HTML ali,
  • 00:05:17
    uma estrutura HTML com vários elementos
  • 00:05:20
    desnecessários, tá? E usar e usufuri do
  • 00:05:24
    melhor que o Angler fornece pra gente.
  • 00:05:26
    Continuando, então, ó, a gente tem esse
  • 00:05:29
    card aqui, que é basicamente esse
  • 00:05:31
    carinha aqui que tem a borda azul e tudo
  • 00:05:33
    mais. Tá? Então, ó, eh, a ideia é que a
  • 00:05:37
    gente passa isso daqui para um
  • 00:05:39
    componente eh que, enfim, possa ser
  • 00:05:42
    reutilizado, tá bom? Então, bora lá. Vou
  • 00:05:45
    dar um contrtrol C aqui. Eu vou criar um
  • 00:05:47
    componente aqui mesmo, tá? Depois eu
  • 00:05:49
    passo para outro lugar. Vamos lá. NG
  • 00:05:53
    component. Vou criar de forma in line
  • 00:05:56
    mesmo. Então, vamos lá. Componente. Vou
  • 00:05:57
    botar aqui app card, tá? Vou botar o
  • 00:06:01
    template
  • 00:06:02
    aqui. Pode tirar esse cara por enquanto,
  • 00:06:05
    tá bom? Eh, o estilo, eu vou pegar o
  • 00:06:09
    mesmo estilo aqui,
  • 00:06:12
    ó.
  • 00:06:13
    Card. Vou botar esse cara
  • 00:06:17
    aqui, tá? Eu vou botar aqui, ó,
  • 00:06:22
    card. E esse cara eu vou tirar aqui.
  • 00:06:25
    Pronto. Dá uma dentada. E é isso aí.
  • 00:06:29
    Agora o item aqui vai dar erro mesmo,
  • 00:06:31
    né? Afinal, eu
  • 00:06:33
    tô pedindo o negócio, então só vou pedir
  • 00:06:36
    aqui
  • 00:06:37
    um title normal, tá? Pera aí que aí tá
  • 00:06:41
    tá me tirando aqui,
  • 00:06:45
    velho.
  • 00:06:47
    Deu. Eu vou pedir uma input title e uma
  • 00:06:50
    input body, digamos assim, tá? E aqui eu
  • 00:06:54
    vou ter uma output.
  • 00:06:58
    Vou vir aqui
  • 00:06:59
    input ã botar title, né? Escrever
  • 00:07:03
    direito isso
  • 00:07:07
    aqui, dessa forma
  • 00:07:10
    aqui.
  • 00:07:11
    Isso. Bor isso aí. E aqui vai ser uma
  • 00:07:16
    output, tá? Delete port vai ser uma
  • 00:07:19
    output.
  • 00:07:22
    Pronto. Então aqui a única coisa que eu
  • 00:07:24
    tenho que fazer vai
  • 00:07:29
    ser emitir, né? Posso botar aqui a
  • 00:07:34
    emit dessa forma aqui, tá? Deu. Pronto.
  • 00:07:39
    Agora eu vou pegar esse
  • 00:07:41
    cara e vou usar ele aqui
  • 00:07:45
    dentro, tá?
  • 00:07:48
    Ã, vou dar uma melhoradinha. Isso daqui
  • 00:07:50
    dá para passar para um elemento, tá, no
  • 00:07:52
    HTML certinho, isolado, numa estrutura
  • 00:07:55
    de arquivos, mas eu só quero usar rápido
  • 00:07:58
    isso, tá? Não se
  • 00:08:00
    preocupa. Então vamos lá. Vou vir aqui
  • 00:08:04
  • 00:08:06
    title. Opa.
  • 00:08:11
    Ã, item title, item body.
  • 00:08:14
    Perfeito. E aqui na output eu vou usar a
  • 00:08:18
    minha meu método que já
  • 00:08:22
    existe, tá? Então aqui eu consigo tirar
  • 00:08:25
    toda essa estrutura aqui que eu não vou
  • 00:08:27
    usar, tá? Inclusive aqui eu consigo
  • 00:08:31
    fechar e eu não preciso mais desse
  • 00:08:34
    cara. Então vou formatar. Vamos ver como
  • 00:08:37
    vai ficar o HTML.
  • 00:08:39
    Ó, da mesma forma. Curioso, né? Isso é
  • 00:08:42
    bem legal. Olha só, a gente basicamente
  • 00:08:45
    componentizou todo um bloco de HTML, tá?
  • 00:08:48
    E deu basicamente um sentido a ele, né?
  • 00:08:51
    Agora a gente sabe que a gente tá dentro
  • 00:08:53
    de um loop e a gente tá renderizando o
  • 00:08:55
    componente card, né? Só mudar aqui. Deu,
  • 00:09:00
    ó. Então, a gente tem o o nosso
  • 00:09:03
    componente host com estilo próprio e o
  • 00:09:05
    card aqui que dá para meter um estilo
  • 00:09:08
    próprio também, né? Aqui, no caso ele tá
  • 00:09:09
    usando uma div eh inútil ainda, né? a
  • 00:09:13
    gente já pode melhorar esse daqui
  • 00:09:15
    também, tá? Ó, então a gente vai vir
  • 00:09:17
    aqui HTML, pá, pá, pá. Tá, vou vir aqui.
  • 00:09:21
    Eh, cadê? Onde eu tô? Tô tô, tô aqui.
  • 00:09:23
    Vou mudar aqui pro host, né, como a
  • 00:09:26
    gente já tava fazendo. E aqui,
  • 00:09:30
    nosso HTML, eu posso tirar esse cara que
  • 00:09:32
    é uma diva
  • 00:09:33
    inútil, tá? Vou pedir para ele formatar.
  • 00:09:41
    E olha só, bem melhor. Agora o app card
  • 00:09:45
    já tem o estilo próprio, continua da
  • 00:09:47
    mesma forma a estrutura e a gente não
  • 00:09:49
    tem mais divis inútil, inúteis, na
  • 00:09:53
    verdade, né? Então, a gente só tem o H3,
  • 00:09:55
    ã, o textinho aqui e o botão, tá? Só
  • 00:09:59
    para ver aqui, ó. Normal. Só que, né,
  • 00:10:02
    provavelmente. Deixa eu ver.
  • 00:10:05
    Delete. É, o delete tá funcionando
  • 00:10:07
    ainda. Tá fazendo a requisição HTTP
  • 00:10:09
    normal. Deixa eu só ver aqui.
  • 00:10:11
    Networking,
  • 00:10:13
    ó. Botar aqui um delete aqui, ó. Apertar
  • 00:10:15
    aqui, ó. Tá deletando normal. E dado
  • 00:10:19
    isso, basicamente porque eu tô emitindo
  • 00:10:21
    aqui uma output, tá? Quando eu clico no
  • 00:10:24
    botão, ó, e daí ele chama o método
  • 00:10:29
    normal. Então, basicamente pro nosso
  • 00:10:30
    componente a chamada tá funcionando
  • 00:10:32
    igual, tá?
  • 00:10:35
    Claro. Agora o que que a gente tem que
  • 00:10:36
    fazer é criar um componente, tá? Então
  • 00:10:39
    vou vir aqui, vou matar o
  • 00:10:42
    servidor, subir um pouquinho aqui só pra
  • 00:10:44
    gente ter uma noção melhor. NPX NPX NX
  • 00:10:49
    não, né? Só tá acostumado a usar NX
  • 00:10:51
    aqui. Meu Deus. Eh, dá botar aqui
  • 00:10:54
    components, tá? É um, é super pequeno
  • 00:10:57
    esse projeto, então vou criar umas
  • 00:10:59
    pastas bem específicas.
  • 00:11:01
    Ã, components, voltar card.
  • 00:11:05
    Tá? Então é isso
  • 00:11:08
    aí, não. Então ele vai criar ali a
  • 00:11:10
    pastinha card dentro de components.
  • 00:11:13
    Card,
  • 00:11:15
    beleza? E vou passar esse cara para lá,
  • 00:11:18
    que é o jeito certo trabalhar, né? Sem
  • 00:11:21
    gambiarra
  • 00:11:22
    aqui. Vamos
  • 00:11:25
    lá. Show.
  • 00:11:27
    Pera aí, só vou deixar esse cara
  • 00:11:30
    aqui. Beleza. Eu vou pegar esse estilo,
  • 00:11:36
    né? Vou passar para
  • 00:11:40
    cá, pegar
  • 00:11:42
    o
  • 00:11:45
    HTML e vou passar para
  • 00:11:48
    cá. Show.
  • 00:11:52
    Pronto. E aqui, claro, eu tenho que
  • 00:11:54
    mudar pro HTML URL, né? E aqui o estilo,
  • 00:12:00
    mesma coisa, ter que mudar pro outro
  • 00:12:03
    lado. RLS. Isso.
  • 00:12:07
    Boa. Aqui eu vou dar um control ponto e
  • 00:12:09
    adicionar todos os importes faltantes.
  • 00:12:12
    Pronto. Então aqui tá certinho, né? Ó,
  • 00:12:16
    aparentemente tudo legal que eu vou
  • 00:12:18
    pegar aqui card component. Vou atualizar
  • 00:12:21
    aqui o importe, né? Tem que importar
  • 00:12:24
    certinho. Acho que aqui tá certinho já.
  • 00:12:26
    Aplicação funcionando normal,
  • 00:12:29
    tá? Vamos dar para ver. Agora sim,
  • 00:12:32
    código tá
  • 00:12:34
    legal. Vamos dar uma olhada agora no
  • 00:12:37
    type, né, que geralmente é a parte mais
  • 00:12:39
    complicadinha de escrever e melhorar. Ó,
  • 00:12:43
    então, já que a gente tem tudo
  • 00:12:44
    componentizado, vamos dar uma olhada
  • 00:12:46
    aqui, ó. Não tem tipagem. Não tem
  • 00:12:48
    tipagem. A gente tá usando isso daqui
  • 00:12:51
    constructor, tal, dá para usar um previt
  • 00:12:53
    aqui,
  • 00:12:54
    né? O NG ngit também tá com chamada
  • 00:12:59
    direta aqui. E isso daqui também tá com
  • 00:13:02
    chamada direta aqui. Dá para fazer
  • 00:13:03
    bastante coisa melhor. Vamos começar
  • 00:13:05
    aqui, né? Primeiro é botando um private
  • 00:13:08
    aqui, tá? Na verdade, private não. Vamos
  • 00:13:11
    usar da forma mais legal, mas caso você
  • 00:13:14
    esteja numa versão mais antiga do
  • 00:13:15
    Angler, dá para usar dessa forma aqui,
  • 00:13:17
    ó. É bem mais simples,
  • 00:13:20
    tá? Bem mais simples mesmo. Ó, deu. É a
  • 00:13:24
    mesma coisa quando a gente põe o private
  • 00:13:25
    no constructor assim, tá? Dessa forma
  • 00:13:28
    aqui,
  • 00:13:30
    ó. Ó que legal. Essa setinha aqui é da
  • 00:13:32
    hora, hein? E a gente cria uma
  • 00:13:35
    propriedade e em conjunto quando a gente
  • 00:13:38
    injecta. Então, a gente vai fazer a
  • 00:13:39
    injeção do HTTP client aqui, né? No caso
  • 00:13:42
    aqui, esse cara aqui, a gente faz a
  • 00:13:44
    injeção e em paralelo, tá? a gente já
  • 00:13:49
    cria uma propriedade aqui que a gente já
  • 00:13:51
    pode usar aqui, por exemplo, ó.
  • 00:13:53
    Entendeu? Então, o TypeScript já faz
  • 00:13:55
    isso pra gente, tá? Isso se você tiver
  • 00:13:58
    usando uma versão mais antiga do Angler,
  • 00:14:00
    tá? Se você tiver usando uma versão
  • 00:14:03
    Angler 14 para cima, você
  • 00:14:06
    consegue criar
  • 00:14:09
    eh esse cara aqui com
  • 00:14:12
    inject, tá? Vamos lá. http client. Vou
  • 00:14:17
    vir aqui, botar aqui
  • 00:14:20
    inject. Deu. Aí eu posso tirar esse cara
  • 00:14:23
    aqui, tá? E aqui eu gosto de botar um
  • 00:14:26
    private também em read only, tá? Para
  • 00:14:29
    evitar que, sei lá, alguém sobrescreva
  • 00:14:32
    aí a instância do HTTP client. E também
  • 00:14:35
    não quero que ninguém acesse esse cara
  • 00:14:37
    no template. Então, private aqui ele vai
  • 00:14:39
    fechar certinho a casinha, tá? Outro
  • 00:14:42
    ponto aqui é tipar, né? esses items, né?
  • 00:14:47
    Dá para ver que esses items aqui, na
  • 00:14:48
    verdade, eles estão sendo muito usados.
  • 00:14:51
    Eh, deixa eu só me achar aqui. Ai, meu
  • 00:14:53
    Deus. Aqui, né? Dá para ver que eles
  • 00:14:55
    estão sendo usados aqui, ó, no caso,
  • 00:14:58
    ó, ó, para listar as coisas, né? E
  • 00:15:02
    também estão sendo usados aqui. Opa.
  • 00:15:05
    Aqui e aqui, né? Então, dá para ver que
  • 00:15:09
    ele tem um title, ele tem um body e ele
  • 00:15:11
    também tem um ID. Tem três propriedades
  • 00:15:15
    aí no mínimo que a gente precisa tipar,
  • 00:15:19
    né, para ficar estático. E aqui a gente
  • 00:15:20
    está usando um N, tá? Então vamos dar
  • 00:15:23
    uma olhada aí, né? Primeiro de tudo lá
  • 00:15:26
    no nosso servidor, tá? Eu tô consumindo
  • 00:15:29
    MAPI aqui, dá pra gente olhar direto
  • 00:15:31
    aqui, tá? Não precisa de mistério.
  • 00:15:33
    Então, dá para ver aqui basicamente as
  • 00:15:36
    propriedades aqui que vem nesse Jason,
  • 00:15:39
    tá? Então, olha só que legal. A gente
  • 00:15:41
    tem aqui basicamente, né, o preview ali
  • 00:15:43
    dá uma formatada, mas dá pra gente vir
  • 00:15:45
    aqui direto e dar uma olhada. Então vou
  • 00:15:48
    pegar esse cara aqui, tá? Uma forma
  • 00:15:51
    legal de fazer isso daqui é
  • 00:15:53
    basicamente fazer isso. Eu geralmente
  • 00:15:56
    uso IA, né? Então vou fazer aqui, ó,
  • 00:16:02
    transformoso, tá? Acho que todo
  • 00:16:04
    programador é meio preguiçoso. Em uma
  • 00:16:10
    interface
  • 00:16:13
    ts. Aí ele vai vir aqui fazer esse tramp
  • 00:16:16
    para mim, ó. Pronto. Agora eu tenho uma
  • 00:16:18
    interface typescript, tá? Então eu sei
  • 00:16:21
    que eu tenho um post aqui, tá? Que é
  • 00:16:23
    exatamente o que vai vir lá do meu
  • 00:16:25
    servidor, tá? Vou vir aqui itens e como
  • 00:16:29
    eu sei que é
  • 00:16:31
    um array, né? No caso, ele tava vindo N
  • 00:16:34
    aqui, né? Vou vir aqui, vou botar RV.
  • 00:16:37
    Ele pede aqui para mim inicializar
  • 00:16:38
    também. Então, já vou inicializar
  • 00:16:40
    certinho, ó. Então, beleza. Agora eu já
  • 00:16:42
    sei que eu tenho posts aqui, eh,
  • 00:16:44
    interface do tipo posts e ele vai
  • 00:16:46
    começar a restringir algumas coisas, né?
  • 00:16:48
    Afinal, por exemplo, aqui, ó, tá
  • 00:16:51
    dizendo, ó, o objeto, né, basicamente,
  • 00:16:53
    ó, o objeto, o tipo objeto não é
  • 00:16:56
    atribuível, né, para esse tipo aí poche,
  • 00:16:59
    tá? O objeto ele é meio genérico, né?
  • 00:17:01
    Então o que que eu vou fazer aqui? Vou
  • 00:17:03
    dizer pro get aqui do http client que
  • 00:17:06
    ele vai na verdade trazer um array de
  • 00:17:08
    posts. Agora sim, ó, ele vai dizer aqui,
  • 00:17:10
    ó, resposta, né, que vem lá do http
  • 00:17:13
    client vai ser um array posts que é
  • 00:17:15
    totalmente compatível com o meu items.
  • 00:17:18
    Beleza? Pronto, agora eu já tenho uma
  • 00:17:20
    tipagem bonitinha. Outro ponto aqui, né,
  • 00:17:23
    é a gente dar uma melhorada nesse cara
  • 00:17:25
    aqui, ó. Basicamente a gente tá fazendo
  • 00:17:27
    algumas requisições, né? Dá para ver que
  • 00:17:29
    estão fazendo aqui também que não tá
  • 00:17:31
    muito legal, tá? Então, basicamente o
  • 00:17:34
    componente, a responsabilidade do
  • 00:17:36
    componente é ele basicamente manipular o
  • 00:17:39
    template, fornecer dados ali pro
  • 00:17:41
    template, né, que a gente tá vendo, que
  • 00:17:43
    é esse cara aqui, né? Então, quando a
  • 00:17:46
    gente faz operações HTTP diretamente
  • 00:17:48
    assim, a gente tá eh fugindo, né, e
  • 00:17:51
    infringindo também a responsabilidade
  • 00:17:53
    desse cara. E outra que também a gente
  • 00:17:55
    tá evitando a reusabilidade de recursos
  • 00:17:58
    HTTP, né? Então a gente poderia jogar
  • 00:18:00
    isso numa service e a gente conseguiria
  • 00:18:03
    injetar em qualquer outro lugar que
  • 00:18:04
    precisasse recuperar posts também, tá?
  • 00:18:08
    Então o que que a gente vai fazer aqui é
  • 00:18:09
    criar uma service, tá? Vou vir aqui, ó.
  • 00:18:13
    Vou vir aqui pá, vou vir aqui ng
  • 00:18:16
    generate s, tá? Eu vou criar aqui uma
  • 00:18:20
    pastinha services bem de boa, tá?
  • 00:18:24
    Vou botar aqui, ó, posts.
  • 00:18:27
    Tá pronto, ó. Criou services posts, não
  • 00:18:31
    sei o que
  • 00:18:32
    lá. Deu, ó, service posts. Então, vou
  • 00:18:36
    pegar esse cara aqui, tá bem de
  • 00:18:39
    boa. E vou criar aqui um método
  • 00:18:43
    get. Pode ser get posts, tá? Não vejo
  • 00:18:45
    problema
  • 00:18:49
    não. E aqui eu vou botar um cara aqui,
  • 00:18:52
    tá?
  • 00:18:53
    Então esse cara aqui, ele vai
  • 00:18:55
    basicamente fazer essa
  • 00:18:59
    injeção aqui, mesma forma, tá? E vai dar
  • 00:19:04
    alguns erros de import. Vou pedir para
  • 00:19:06
    ele importar todo
  • 00:19:08
    mundo. Pronto. Aqui, nesse caso, eu não
  • 00:19:12
    preciso de um subscribe, tá? Que que eu
  • 00:19:14
    preciso, na verdade, é só retornar esse
  • 00:19:16
    cara aqui, ó, esse observable, tá? Esse
  • 00:19:19
    get aqui, no caso, é um observable, tá?
  • 00:19:21
    Então ele vai retornar esse observable
  • 00:19:24
    aqui. Posso
  • 00:19:29
    tirar? Deu. Tá? Então o único trampo que
  • 00:19:32
    ele vai fazer aqui é recuperar todos os
  • 00:19:35
    posts. Belezinha? Show. Vamos voltar
  • 00:19:38
    para lá, ó. Então aqui eu tenho que,
  • 00:19:41
    claro,
  • 00:19:43
    eh mudar, né? Basicamente eu tenho que
  • 00:19:46
    vir aqui, digamos, eu tinha o código
  • 00:19:48
    aqui, só deixa eu reutilizar aqui que eu
  • 00:19:50
    sou meio
  • 00:19:51
    preguiçoso. Não gosto de ficar
  • 00:19:53
    escrevendo as coisas de novo e de novo e
  • 00:19:55
    de novo, tá? É meio
  • 00:19:57
    chato. Então vamos lá, ó. Show. Post
  • 00:20:02
    services. Vim aqui. Olha só que legal.
  • 00:20:06
    Vim aqui. Get posts. Pronto. Ó, mesma
  • 00:20:09
    coisa.
  • 00:20:11
    Eh, uma prática legal também é a gente
  • 00:20:13
    não ficar poluindo o NG1 init com várias
  • 00:20:16
    coisas também, tá? E sim, dá pra gente
  • 00:20:19
    usar um, por exemplo, uma sync aqui para
  • 00:20:22
    fazer requisição aqui no for, tá? Mas eu
  • 00:20:25
    não gosto, eu acho meio estranho,
  • 00:20:27
    geralmente, tá? Apesar dele já fazer o
  • 00:20:29
    subscribe e tudo mais, mas para requisão
  • 00:20:32
    HTTP e geralmente a gente não precisa
  • 00:20:36
    assim se preocupar tanto com
  • 00:20:37
    unsubscribe, tá? Geralmente, tá? Então,
  • 00:20:41
    para esse caso aqui, eu sei que a
  • 00:20:42
    requisição vai começar e terminar na
  • 00:20:44
    inicialização do componente. Então, vou
  • 00:20:46
    vir aqui e só fazer isso daqui, ó.
  • 00:20:49
    Private, tá? Get
  • 00:20:52
    posts, tá? Então, daí eu vou fazer aqui,
  • 00:20:55
    escrever direito aqui, né?
  • 00:20:58
    Ó, pronto. E aí eu vou chamar quando o
  • 00:21:02
    componente de fato
  • 00:21:04
    inicia, tá?
  • 00:21:08
    Na verdade
  • 00:21:09
    aqui, né,
  • 00:21:11
    G posts
  • 00:21:14
    isso
  • 00:21:17
    assim é uma forma legal de fazer, tá?
  • 00:21:19
    Porque daí dessa forma aqui a gente não
  • 00:21:22
    tá poluindo o NG, porque o Energy Unity
  • 00:21:26
    pode ter várias lógicas, mas caso você
  • 00:21:29
    queira fazer algo encadeado, aí o trampo
  • 00:21:32
    seria outro, né? Mas nesse caso aqui eu
  • 00:21:34
    não preciso, tá? Então eu posso passar
  • 00:21:37
    essa lógica para dentro de um método
  • 00:21:40
    específico que vai fazer eh essa
  • 00:21:42
    asserção aqui, tá legal?
  • 00:21:47
    Ã, dessa forma aqui já tá bem legal.
  • 00:21:49
    Aqui também no delete eu consigo pegar a
  • 00:21:52
    mesma coisa,
  • 00:21:53
    tá? Vou pegar aqui o
  • 00:21:56
    delite. Vamos lá pro
  • 00:21:59
    serviço. Então vou botar aqui
  • 00:22:02
    delete post, tá?
  • 00:22:05
    Ele vai receber um ID,
  • 00:22:07
    né, tipo
  • 00:22:12
    number. E eu não tô muito confiante
  • 00:22:14
    nesse cara aqui,
  • 00:22:17
    tá? Aqui.
  • 00:22:19
    Pá, aqui. Deixa eu só ver onde que eu tô
  • 00:22:22
    errando aqui. Delete. Tira esse cara. E
  • 00:22:26
    aqui tem que fechar, né? Com
  • 00:22:29
    chaves. Deu. Então já vir aqui. Deletar.
  • 00:22:32
    Show.
  • 00:22:35
    Aqui eu vou fazer a mesma coisa que eu
  • 00:22:37
    tava fazendo aqui,
  • 00:22:41
    né? Aqui eu só preciso pegar esse ID,
  • 00:22:44
    não preciso de
  • 00:22:47
    string. E vou tirar esse ponto
  • 00:22:51
    aqui. E elite P.
  • 00:22:54
    Pronto. Show. Agora eu tenho, né, eh, um
  • 00:23:00
    serviço certinho aqui, ó, para pegar
  • 00:23:03
    posts e deletar. Consigo reutilizar
  • 00:23:06
    também esse cara. E a lógica aqui do
  • 00:23:08
    componente ficou bem mais direto, porque
  • 00:23:09
    eu tô delimitando, né, delegando, quer
  • 00:23:12
    dizer, operações para outra entidade que
  • 00:23:15
    é um service. Beleza? Deixa eu vir aqui
  • 00:23:17
    no nosso componente, a gente vai
  • 00:23:19
    conseguir deletar normal as coisas.
  • 00:23:22
    Ó, deleta aqui, lista certinho. Outra
  • 00:23:26
    coisa que a gente consegue fazer aqui é
  • 00:23:28
    basicamente trocar esse cara aqui por um
  • 00:23:30
    signal, tá? Pra gente modernizar um
  • 00:23:33
    pouco mais aí esse essa forma de
  • 00:23:36
    trabalhar aí com der bind no Angler, tá?
  • 00:23:40
    Vamos lá. Vou botar aqui
  • 00:23:44
    botar aqui igual, né? Signal.
  • 00:23:48
    Aqui eu vou botar dessa forma, vou tipar
  • 00:23:50
    dessa forma e vai receber um array.
  • 00:23:55
    Pronto, aqui vamos botar. Show, ó. Então
  • 00:23:59
    ele basicamente recebe, né, a tipagem
  • 00:24:02
    dele recebe
  • 00:24:03
    um digamos assim, um tipo que ele vai
  • 00:24:06
    ter, um valor inicial e options se a
  • 00:24:08
    gente precisar mudar alguma coisa, tá?
  • 00:24:10
    Então dessa forma a gente consegue fazer
  • 00:24:12
    assim. Daí para atribuir um valor num
  • 00:24:15
    signal, né, a gente tem que usar os
  • 00:24:16
    métodos set, tá? Então vai vir aqui set,
  • 00:24:20
    tá? Ao invés de só atribuir
  • 00:24:22
    diretamente, tá? E aqui também a gente
  • 00:24:26
    vai vir aqui 7 ponto aqui. Pronto, que
  • 00:24:30
    daí a gente roda como se fosse uma
  • 00:24:32
    função. E lá no template a gente vai
  • 00:24:36
    usar dessa forma aqui, tá? Então, se eu
  • 00:24:39
    dar um F5 aqui, funciona da mesma forma.
  • 00:24:42
    Não consigo
  • 00:24:44
    deletar
  • 00:24:46
    aqui.
  • 00:24:48
    Pronto. Na verdade, não deletou ali
  • 00:24:51
    porque eu tô vindo aqui e eu tô
  • 00:24:53
    atribuindo dessa forma aqui, ó. Então,
  • 00:24:55
    tem que vir em
  • 00:24:58
    sete, tá?
  • 00:25:03
    Pronto,
  • 00:25:06
    certinho. Bom, então só deletar aqui.
  • 00:25:09
    Agora sim, ó. Ele tava fazendo
  • 00:25:12
    requisição, mas não atualizava o signo.
  • 00:25:14
    Tá show. Então, dessa forma, eu
  • 00:25:17
    reatribuo o array. Próximo passo aqui é
  • 00:25:20
    a gente melhorar esse cara aqui, né?
  • 00:25:23
    Basicamente a gente tem esse ID, né, que
  • 00:25:27
    a gente verifica aqui, ó. Basicamente a
  • 00:25:29
    gente vem em todos os itens, ó, né? A
  • 00:25:32
    gente faz um map em cima, que é
  • 00:25:34
    basicamente um loop, mas aqui tá errado,
  • 00:25:38
    tá? Tá errado isso daqui. Claramente tá
  • 00:25:40
    errado. Por quê? Porque o map ele serve
  • 00:25:42
    pra gente modificar uma estrutura, tá?
  • 00:25:45
    Então a gente mapeia, por exemplo, um
  • 00:25:47
    arrway que tem um objeto gigantesco com
  • 00:25:49
    vários objetos, com várias propriedades,
  • 00:25:52
    a gente consegue mapear duas ou três
  • 00:25:53
    propriedades e criar uma nova estrutura
  • 00:25:55
    de objetos dentro do array com só
  • 00:25:58
    aquelas propriedades que a gente
  • 00:25:59
    selecionou. Então essa é a ideia do map.
  • 00:26:01
    Então aqui tá sendo usado da forma
  • 00:26:02
    errada, tá? E aqui basicamente tem um
  • 00:26:05
    if, tá? Que vai verificar se o ID que a
  • 00:26:09
    gente tá deletando é igual, né? Se ser
  • 00:26:12
    diferente, no caso, ele recria, ele cria
  • 00:26:16
    um novo array aqui,
  • 00:26:18
    basicamente com os itens que não foram
  • 00:26:21
    deletados e reaplica aqui nesse itens
  • 00:26:24
    aqui que estão de fato sendo rederizado.
  • 00:26:28
    Então, basicamente ele faz uma exclusão
  • 00:26:30
    recriando todos os itens, tirando aquele
  • 00:26:32
    que foi excluído lá do servidor, tá? Se
  • 00:26:37
    aqui, tá? Ó, aqui, tá pronto. Então,
  • 00:26:41
    basicamente é isso que acontece quando
  • 00:26:43
    eu aperto o delete aqui, tá? E apago no
  • 00:26:45
    servidor, mas eu removo de fato da
  • 00:26:48
    memória ali do da lista, tá? Então, uma
  • 00:26:51
    forma de fazer isso daqui bem mais fácil
  • 00:26:53
    é usando o método array, né, filter, que
  • 00:26:57
    já faz esse trampo pra gente, ele filtra
  • 00:27:00
    tudo que a gente passa ali na condição.
  • 00:27:02
    Então, com signals fica até mais fácil
  • 00:27:04
    de fazer, tá? O que que eu vou fazer
  • 00:27:07
    aqui? Basicamente é tirar esse cara
  • 00:27:10
    aqui. Vou botar aqui, ó,
  • 00:27:14
    ponto. Eu vou usar o fio, o signal, ele
  • 00:27:17
    tem uma parada bem legal que ele para
  • 00:27:20
    usar, para consumir o valor interno do
  • 00:27:22
    signal, a gente usa como se fosse uma
  • 00:27:24
    função. Mas para manipular
  • 00:27:27
    a instância do signal, a gente usa como
  • 00:27:29
    se fosse um objeto, tá? Então, a gente
  • 00:27:31
    tem o sete aqui para setar um valor,
  • 00:27:34
    substituindo totalmente o valor interno
  • 00:27:35
    dele. A gente tem um update também. E o
  • 00:27:38
    update,
  • 00:27:40
    basicamente, ele serve pra gente pegar o
  • 00:27:42
    valor atual e fazer o update, como o
  • 00:27:45
    próprio nome diz, né? Então, olha só que
  • 00:27:47
    legal, a já até sabe aqui que dá para
  • 00:27:49
    fazer de jeito melhor. Então, vou vir
  • 00:27:50
    aqui, ó, update, vou pegar os itens
  • 00:27:52
    atuais, né? E eu vou pegar aqui a os
  • 00:27:55
    itens atuais, vou fazer um filter e vou
  • 00:27:59
    dizer, ó, tudo que for diferente desse
  • 00:28:04
    array aí que eu tô passando aqui, tá?
  • 00:28:07
    Deixa eu botar aqui, ó. Coisa chata.
  • 00:28:11
    Aqui, ó, tudo que eu tô passando aqui,
  • 00:28:13
    ó, tudo que for diferente esse ID, eu
  • 00:28:16
    vou excluir e criar um novo array sem
  • 00:28:19
    esse cara.
  • 00:28:21
  • 00:28:23
    pronto? Então aqui eu vou atualizar os
  • 00:28:26
    itens. Aqui ele não retorna nada, tá? E
  • 00:28:29
    ele já vai fazer essa atualização para
  • 00:28:32
    mim. Então não preciso fazer mais nada.
  • 00:28:34
    Vamos lá ver. Ó, pronto. Ó, deleto,
  • 00:28:39
    deleto, deleto. Por quê? Porque quando
  • 00:28:42
    eu tô basicamente eh rodando esse cara,
  • 00:28:46
    ele já vai atualizar o valor interno do
  • 00:28:49
    signal, tá? E isso daqui, a reatividade
  • 00:28:51
    do ângulo já vai identificar aqui, tá?
  • 00:28:54
    Inclusive signals, eles já surgiram
  • 00:28:56
    justamente pra gente não precisar dessa
  • 00:28:59
    usar ao longo do tempo essa reatividade
  • 00:29:02
    do zone JS que o Angler tem, tá? Então a
  • 00:29:05
    ideia é que o signals realmente vá
  • 00:29:07
    substituindo e seja a nova forma de
  • 00:29:09
    renderizar os componentes, tá? Os
  • 00:29:12
    templates no ângulo. E valeu por
  • 00:29:14
    assistir esse vídeo, deixa um like, se
  • 00:29:15
    inscreve, comenta, protocolo padrão e é
  • 00:29:18
    isso aí. Vou deixar alguns videozinhos
  • 00:29:20
    aqui para você assistir logo depois. E
  • 00:29:23
    valeu,
Etiquetas
  • Angular
  • refatoração
  • código legado
  • componentes reutilizáveis
  • TypeScript
  • serviços
  • signals
  • reatividade
  • boas práticas
  • programação