Angular-Loiane-Training

Este repositorio contem exemplos documentados e descricoes dos conteudos estudados ao longo do curso de Angular da Loiane

View project on GitHub

Criacao do primeiro service.

Vamos tomar o exemplo onde desejamos exibir uma lista de itens, neste caso uma lista de cursos. vamos criar um component que ira renderizar a nossa lista.


figura 1 - Exemplo de lista de cursos

#

Implementacao sem classe service

Template

<h4> criacao do primeiro service<h4>
<br>
<h5>Lista de cursos</h5>
<ul>
    <li *ngFor="let curso of cursos">
        
    </li>
</ul>

Component

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

@Component({
  selector: 'cursos',
  templateUrl: './cursos.component.html',
  styleUrls: ['./cursos.component.css']
})
export class CursosComponent implements OnInit {

  // lista de cursos a serem exibidos.
  cursos: string[] = ['angular', 'nodeJs', 'phonegap']

  constructor() { }

  ngOnInit(): void {
  }

}

note que a lista de cursos em nosso exemplo esta declarada diretamente no codigo (hard coded) do component, mas no cotidiano estes dados sao variaveis resgatadas de outros locais (servidor, back-end), e para realizar essa tarefa o ideal para manter uma arquitetura de software organizada e utilizar uma classe service. Para simplificar o exemplo vamos implementar um metodo “getCursos()” no qual retorna um array contendo os nomes dos cursos, metodos Http serao vistos em outro modulo.

Implementacao com classe service

export class PrimeiroService {

    constructor(){

    }

    getCursos(){
        return ['angular 2', 'Java', 'NodeJs']
    }
}

esta e uma classe simples que utiliza apenas codigo javascript (ECMAScript2015).
Vamos implementar a classe service no component, para isso devemos ter uma instancia da classe PrimeiroService na classe CursosComponent.

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

// import da class PrimeiroService
import { PrimeiroService } from '../../primeiro-service/primeiro-service.service';

@Component({
  selector: 'cursos',
  templateUrl: './cursos.component.html',
  styleUrls: ['./cursos.component.css']
})
export class CursosComponent implements OnInit {

  // lista de cursos a serem exibidos.
  cursos: string[] = []

  // variavel do tipo PrimeiroService para guardar a instancia
  cursosService: PrimeiroService

  // construtor instancia um objeto PrimeiroService
  constructor() {
      this.cursosService = new PrimeiroService()
  }
 
  // ngOnInit() armazena os valores dos cursos recuperados pelo metodo getCursos() da classe PrimeiroService na variavel cursos do CursosComponent.
  ngOnInit(): void {
      this.cursos = cursosService.getCursos()
  }

}

o resultado sera o mesmo do primeiro exemplo, porem os dados sao obtidos por meio da classe service.

#

Problema comum

Vamos estenter nosso exemplo para o caso onde a assinatura do construtor da classe service PrimeiroService possui um parametro, conforme o exemplo a seguir.

export class PrimeiroService {

    constructor(private http: Http2Server){
        
    }

    getCursos(){
        return ['angular 2', 'Java', 'NodeJs']
    }
}

para instanciar a classe PrimeiroService sera necessario fornecer ao construtor um objeto do tipo Http2Server como argumento.

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

import { PrimeiroService } from '../../primeiro-service/primeiro-service.service';

@Component({
  selector: 'cursos',
  templateUrl: './cursos.component.html',
  styleUrls: ['./cursos.component.css']
})
export class CursosComponent implements OnInit {

 
  cursos: string[] = []
  cursosService: PrimeiroService

  // variavel com objeto Http2Server para instanciar a classe PrimeiroService
  httpServer: Http2Server = new Http2Server()

  constructor() {
      // o construtor precisa receber como argumento um objeto do tipo Http2Server
      this.cursosService = new PrimeiroService(httpServer)
  }
 
  ngOnInit(): void {
      this.cursos = cursosService.getCursos()
  }

}

podemos extender este exemplo para o caso onde o objeto Http2Server necessite receber um objeto do tipo HTMLElement, e assim por diante, aumentando a quantidade de dependencias entre as classes. ficaria muito complexo pois havera a necessidade de fornecer cada dependencia a sua assinatura correspondente, para resolver este problema os services do angular podem ser injetados, aplicando o conceito de injecao de dependencia.