<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Flavio Camello</title>
    <description>The latest articles on DEV Community by Flavio Camello (@flaviocamello).</description>
    <link>https://dev.to/flaviocamello</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F334114%2F9aee58f5-8963-41f3-944c-a19f79077a0a.jpeg</url>
      <title>DEV Community: Flavio Camello</title>
      <link>https://dev.to/flaviocamello</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/flaviocamello"/>
    <language>en</language>
    <item>
      <title>Criar um filtro utilizando BehaviorSubject</title>
      <dc:creator>Flavio Camello</dc:creator>
      <pubDate>Wed, 18 Mar 2020 18:34:49 +0000</pubDate>
      <link>https://dev.to/flaviocamello/criar-um-filtro-utilizando-behaviorsubject-4ail</link>
      <guid>https://dev.to/flaviocamello/criar-um-filtro-utilizando-behaviorsubject-4ail</guid>
      <description>&lt;p&gt;A principal função da utilização do &lt;strong&gt;BehaviorSubject&lt;/strong&gt; é permitir uma fonte única de dados. Com uma visão centralizada de dados, o &lt;strong&gt;BehaviorSubject&lt;/strong&gt; auxilia  quando diversos componentes possuem a necessidade de utilizar o mesmo dado. Sabendo que um dado pode ser alterado por um componente ou usuário ao selecionar ou inserir algo, todos os componentes terão o dado mais atualizado para consultar.&lt;/p&gt;

&lt;p&gt;Utilizaremos a biblioteca &lt;strong&gt;RxJS&lt;/strong&gt; que possui observadores e observáveis. Da biblioteca vamos utilizar o &lt;strong&gt;Subscription&lt;/strong&gt; que funciona de forma muito parecida com o &lt;strong&gt;Observable&lt;/strong&gt;. Com ele nós podemos utilizar o método &lt;i&gt;add&lt;/i&gt;, onde adicionamos o objeto que será "observado". Além disso, utilizaremos o &lt;strong&gt;BehaviorSubject&lt;/strong&gt;, que será utilizado para conter o valor centralizado, e por emitir que o objeto sofreu alteração no valor atual.&lt;/p&gt;

&lt;h3&gt;O que faremos em nosso exemplo?&lt;/h3&gt;

&lt;p&gt;Vamos supor que existe um sistema e que em seu menu está contido um filtro. Esse filtro, é responsável por filtrar vários componentes da tela. Alguns componentes dessa tela necessitam saber o que está contido no filtro, para atualizar os seus dados.&lt;/p&gt;

&lt;h3&gt;Agora, mãos a massa!&lt;/h3&gt;

&lt;p&gt;Primeiro, vamos criar um objeto para ser o filtro. Para simplificar o nosso exemplo, o nosso filtro é apenas um filtro de perfil.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DgHq9z6l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k10gogdjqs8iv7n7bt9s.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DgHq9z6l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k10gogdjqs8iv7n7bt9s.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora criaremos a classe mais importante do nosso exemplo, o &lt;i&gt;FiltroService&lt;/i&gt;. O Service será criado para que o sistema fique desacoplado, permitindo que outras páginas possam utilizar o mesmo filtro. Em nosso service, ficará o nosso filtro único, utilizando o&lt;strong&gt; BehaviorSubject&lt;/strong&gt;. Então, toda vez que o filtro for alterado, o método &lt;i&gt;updateFiltro&lt;/i&gt; será chamado recebendo o novo filtro. O filtro centralizado irá receber o novo filtro, e enviar a todos os componentes que assinam o&lt;strong&gt; BehaviorSubject&lt;/strong&gt; por meio do método &lt;i&gt;next&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5v8p5RtG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/en6gptxjzjuzr2iyu9gg.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5v8p5RtG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/en6gptxjzjuzr2iyu9gg.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por último, nosso exemplo irá mostrar como "assinar" o &lt;strong&gt;BehaviorSubject&lt;/strong&gt; do service. Vamos criar a classe &lt;i&gt;GraficosComponent&lt;/i&gt;, e como você pode ver na figura, foi criado um objeto &lt;i&gt;subs&lt;/i&gt; do tipo &lt;strong&gt;Subscription&lt;/strong&gt; que como eu tinha falado anteriormente, ele nos possibilita adicionar o objeto que queremos "observar". Então no método &lt;i&gt;ngOnInit&lt;/i&gt;, é adicionado o objeto &lt;i&gt;filtroPagina&lt;/i&gt; que é um&lt;strong&gt; BehaviorSubject&lt;/strong&gt; e está no &lt;i&gt;FiltroService&lt;/i&gt; que criamos anteriormente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ISxXafdh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/n7rzir3bf06solcqb1h3.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ISxXafdh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/n7rzir3bf06solcqb1h3.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Concluindo&lt;/h3&gt;

&lt;p&gt;Como visto, o nosso componente &lt;i&gt;GraficosComponent&lt;/i&gt; "assinou" o &lt;strong&gt;BehaviorSubject&lt;/strong&gt; que contém o dado centralizado e assim como o &lt;i&gt;GraficosComponent&lt;/i&gt;, qualquer outro componente que precise do dado do filtro atualizado, deve assinar, esperar ser notificado de alguma alteração e o próprio componente realiza as atualizações necessárias após receber o filtro atualizado.&lt;/p&gt;

&lt;p&gt;Bom, espero ter ajudado!&lt;/p&gt;

</description>
      <category>angular</category>
    </item>
    <item>
      <title>Trafegando dados entre componentes com EventEmitter (@Output)</title>
      <dc:creator>Flavio Camello</dc:creator>
      <pubDate>Wed, 12 Feb 2020 19:37:50 +0000</pubDate>
      <link>https://dev.to/flaviocamello/como-utilizar-o-output-2nk</link>
      <guid>https://dev.to/flaviocamello/como-utilizar-o-output-2nk</guid>
      <description>&lt;p&gt;Para quem está começando a utilizar o framework Angular, eu irei apresentar algo que será utilizado com frequência, então, é importante que saiba muito bem como e quando utilizar. Vou mostrar o funcionamento do decorador @Output.&lt;/p&gt;

&lt;h2&gt;Para que serve?&lt;/h2&gt;

&lt;p&gt;A arquitetura do angular nos permite criar diversos componentes, o que é muito bom, visto que a reutilização de código fica mais fácil. Mas, também existem dificuldades com essa arquitetura, uma delas é que os componentes podem ser utilizados dentro de outros componentes. Com isso, surge um problema que é, a necessidade de troca de informações entre o componente filho e o componente pai. Para isso, utilizamos o @Output. O @Output é responsável por facilitar a comunicação de filho para o pai. O nome @Output passa a ideia de saída de um valor, que é o que acontece na visão do componente filho.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pvYwlmfG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nokoqgoykw4uu8h4715b.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pvYwlmfG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nokoqgoykw4uu8h4715b.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Exemplo prático&lt;/h2&gt;

&lt;p&gt;Vamos criar um programa que irá listar o nome de personagens. Os personagens serão inseridos no componente filho e exibido no componente pai. Vamos começar implementando o componente filho. Nele criaremos a variável &lt;strong&gt;novoPersonagem&lt;/strong&gt; que será decorado pelo @Output.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_CI7kWir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kjnhnr3hfevk80po96h4.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_CI7kWir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kjnhnr3hfevk80po96h4.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que, a variável novo personagem recebe o &lt;strong&gt;new EventEmitter&lt;/strong&gt; que faz parte do @angular/core. O EventEmitter permite ao componente filho gerar um evento para o componente pai, que será utilizado quando existir a necessidade de enviar algo. Além disso, na imagem podemos ver o método &lt;strong&gt;enviarParaPai&lt;/strong&gt; que recebe uma string. Esse método utiliza o &lt;strong&gt;emit&lt;/strong&gt; para emitir ao componente pai que queremos enviar algo, que nesse caso é a variável &lt;strong&gt;value&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para chamar o nosso método &lt;strong&gt;enviarParaPai&lt;/strong&gt; e assim  disparar o evento de emitir, vamos implementar o html do filho.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NDps6CKq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/h2v2colbbcomssse6kdc.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NDps6CKq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/h2v2colbbcomssse6kdc.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O html possui um input para que o usuário escreva o nome dos personagens, e um button que chama o método &lt;strong&gt;enviarParaPai&lt;/strong&gt; passando o que está escrito no input. O próximo passo é no pai.&lt;/p&gt;

&lt;p&gt;Começamos pelo html, que possui também um ngFor para exibir todos os personagens adicionados. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EJC-ULkP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lh5jzdpy4dc7wp99z6iq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EJC-ULkP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lh5jzdpy4dc7wp99z6iq.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que no componente filho decoramos a variável &lt;strong&gt;novoPersonagem&lt;/strong&gt; e emitimos a inserção de um novo personagem. No html do componente pai, ele aparece novamente pois recebeu o decorador @Output o que lhe permite comunicar com o componente pai. Ao emitir um valor será chamado o método &lt;strong&gt;addPersonagem&lt;/strong&gt; passando o item transmitido pelo emit que foi enviado pelo filho.&lt;/p&gt;

&lt;p&gt;Para finalizar, vamos implementar o typeScript do componente pai, que deve conter a variável que irá guardar o nome dos personagens, e o método &lt;strong&gt;addPersonagem&lt;/strong&gt; que irá adicionar o novo personagem emitido.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EaAVUEEC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kukmp22s4ubjpano18ux.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EaAVUEEC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kukmp22s4ubjpano18ux.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que esse texto tenha ajudado a você que está começando!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Trafegando dados entre componentes com inbound property (@Input) </title>
      <dc:creator>Flavio Camello</dc:creator>
      <pubDate>Wed, 12 Feb 2020 13:31:37 +0000</pubDate>
      <link>https://dev.to/flaviocamello/como-utilizar-o-input-36km</link>
      <guid>https://dev.to/flaviocamello/como-utilizar-o-input-36km</guid>
      <description>&lt;p&gt;Para quem está começando a utilizar o framework Angular, eu irei apresentar algo que será utilizado com frequencia, então, é importante que saiba muito bem como e quando utilizar. Vou mostrar o funcionamento do decorador &lt;strong&gt;@Input&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;Para que serve?&lt;/h2&gt;

&lt;p&gt;A arquitetura do angular nos permite criar diversos componentes, e esses componentes podem ser utilizados dentro de outros componentes. Em muitos casos, é necessário trocar informações entre o componente pai e o componente filho, e aí que entra o @Input. O @Input é responsável por facilitar a comunicação de pai para o filho. O nome @Input passa a ideia de inserção de um valor, que é o que acontece na visão do componente filho.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uY0_1FIn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/n58bau6cupr9z6f4hhko.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uY0_1FIn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/n58bau6cupr9z6f4hhko.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Exemplo prático&lt;/h2&gt;

&lt;p&gt;Vamos começar mostrando o que o componente pai deve implementar para que consiga passar um dado para o seu componente filho. Ele simplesmente deve criar a varável que será passada. Esta variável pode ser de qualquer tipo, no exemplo utilizamos uma string:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bZ_DJgDB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dnllkdut9rq6zpbe3nx6.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bZ_DJgDB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dnllkdut9rq6zpbe3nx6.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba que criamos a variável chamada, &lt;strong&gt;variavelDoPai&lt;/strong&gt; e inserimos o valor &lt;strong&gt;"Angular"&lt;/strong&gt;.&lt;br&gt;
Para passar a variável, vamos ao html do componente pai. Lá passamos a variável junto ao selector do componente filho, da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3KGtrsz5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x40blmqrc9udypwl6tqb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3KGtrsz5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x40blmqrc9udypwl6tqb.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repare que, entre aspas está a propriedade fonte que é a variável do pai. E entre colchetes está a variável alvo, que é a do componente filho.&lt;/p&gt;

&lt;p&gt;Agora, vamos implementar a parte do filho. No TypeScript do componente filho, criaremos a variável que irá receber o valor. Como visto na figura anterior, o nome que escolhemos para a variável é, &lt;strong&gt;variavelDoFilho&lt;/strong&gt;. Então iremos declara-la com o decorador @Input como mostra a imagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E0R95joA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mzbss1nb7pigwwon806i.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E0R95joA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mzbss1nb7pigwwon806i.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso esta variável seja utilizada em tela, é preciso apenas fazer um data binding:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y8IOqJ_o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/igo4phi311vuoayde42r.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y8IOqJ_o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/igo4phi311vuoayde42r.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que esse texto tenha ajudado a você que está começando!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
