9
respostas

Dificuldades para entender o código

Não entendi nada do código dessa aula (exceto a primeira parte de ajuste das rotas e o constructor do app.component) e a transcrição não ajudou. Portanto peço que a moderação faça a explicação passo a passo do código abaixo:

ngOnInit(): void {
      this.router.events
        .pipe(filter(event => event instanceof NavigationEnd))
        .pipe(map(() => this.activatedRoute))
        .pipe(map(route => {
          while(route.firstChild) route = route.firstChild;
          return route;
        }))
        .pipe(switchMap(route => route.data))
        .subscribe(event => this.titleService.setTitle(event.title));
      } 
9 respostas

Fala ai Mauricio, tudo bem? Acho que já respondi uma duvida parecida com a sua, dá uma olhada aqui: https://cursos.alura.com.br/forum/topico-muitas-duvidas-94009

Caso ainda não fique claro, a gente vai conversando e eu vou tentando te explicar com mais detalhes.

Espero ter ajudado.

Matheus, eu li todo o tópico, mas ajudou muito pouco. Necessito de uma explicação mais detalhada do código, linha a linha. Por favor.

Fala Mauricio, vamos lá:

this.router.events

Aqui você está ouvindo os eventos que o roteador pode disparar, inicio de navegação, alteração de rota, fim de navegação, etc...

.pipe(filter(event => event instanceof NavigationEnd))

Aqui a gente verifica se o evento foi o fim da navegação, ou seja, se a navegação terminou de ocorrer e a rota foi renderizada.

.pipe(map(() => this.activatedRoute))

Aqui estamos pegando a rota ativa que acabou de terminar de ser navegada.

.pipe(map(route => {

Aqui pegamos a rota ativa e vamos aplicar alguma alteração nela.

while(route.firstChild) route = route.firstChild;

Aqui estamos navegando até a declaração da nossa rota, ou seja, precisamos sair do componente atual e ir até a definição das nossas rotas onde informamos o title, path, component, etc...

return route;

Aqui pegamos a definição da rota atual e retornamos no map, para que ela possa ser acessível no próximo pipe.

.pipe(switchMap(route => route.data))

Aqui pegamos a definição da rota e acessamos a propriedade data dela e com o switchMap retornamos um novo Observable.

subscribe(event => this.titleService.setTitle(event.title))

Aqui fazemos o subscribe no novo Observable retornado pelo switchMap anterior, recebemos o atributo data que agora seria o event e pegamos a propriedade title dele, que seria o que informamos na definição da rota, exemplo::

data: {
    title: 'Sign up'
}

Espero ter ajudado.

Ajudou, mas eu ainda tenho dúvidas sérias.

1- Preciso lembrar novamente, o que é um pipe? Por que os comandos citados precisaram ser feitos dentro de pipes?

2- Não entendi o trecho abaixo:

"while(route.firstChild) route = route.firstChild;

Aqui estamos navegando até a declaração da nossa rota, ou seja, precisamos sair do componente atual e ir até a definição das nossas rotas onde informamos o title, path, component, etc..."

Por que firstChild?

3- Me lembre o que fazem os comandos map e switchMap.

Fala Mauricio, vamos la:

Preciso lembrar novamente, o que é um pipe? Por que os comandos citados precisaram ser feitos dentro de pipes?

Os pipe são decoradores para um Observable ou seja, cada pipe que a gente adiciona ele será executado (seguindo a ordem).

Seria uma ideia de pipeline (linha de produção).

while(route.firstChild) route = route.firstChild;

Aqui está sendo verificado se o componente tem um componente pai, se sim, navegue até o pai, caso não tenha mais pai a gente chegou no primeiro (renderizado pelas rotas do Angular).

3- Me lembre o que fazem os comandos map e switchMap.

O map vai modificar o valor do Observable atual.

O switchMap vai criar um novo Observable com um novo valor.

Espero ter ajudado.

1 e 3 ok.

Mas eu entendi menos ainda essa parte como um todo:

"while(route.firstChild) route = route.firstChild;

Aqui está sendo verificado se o componente tem um componente pai, se sim, navegue até o pai, caso não tenha mais pai a gente chegou no primeiro (renderizado pelas rotas do Angular)."

O que você quis dizer com renderizado pelas rotas do Angular?

Fala Mauricio, vamos lá:

Imagine que você tenha a seguinte arvore de componentes:

FormularioClienteComponent
    GridComponent
        RowComponent
            FormComponent
                InputComponent

Agora imagine que o componente renderizado pelas rotas seja o FormularioClienteComponent, ou seja, é ele que foi definido como component de uma rota:

{ path: 'formulario/cliente, component: FormularioClienteComponent }

Agora imagine que estamos no último nivel, ou seja, no InputComponent e por algum motivo queremos navegar até a declaração da nossas rotas.

Para isso é utilizar o firstChild, algo assim:

  1. A primeira vez que a chamar o firstChild no InputComponent vai ser true, ai a gente vai para o FormComponent.
  2. Ao chamar firstChild no FormComponent vamos para o RowComponent
  3. Ao chamar firstChild no RowComponent vamos para o GridComponent
  4. Ao chamar firstChild no GridComponent vamos para o FormularioClienteComponent
  5. Ao chamar firstChild no FormularioClienteComponent vamos para a definição da nossa rota: { path: 'formulario/cliente, component: FormularioClienteComponent }

A ideia é algo assim.

Espero ter ajudado.

Agora tudo ficou claro. Eu estava achando que o firstChild era o primeiro elemento filho, então estranhei quando vc o usou para chegar ao pai. Mas td bem, agora está tudo certo. Obrigado pela ajuda e pela paciência.

Magina Mauricio, sempre que precisar não deixe de criar suas dúvidas.

Abraços e bons estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software