Criando um Serviço Personalizado no Angular
Criando um Serviço
O Angular fornece um comando de CLI conveniente para gerar rapidamente um serviço, configurando os arquivos e importações necessários:
Após executar este comando, o Angular cria dois arquivos:
-
task.service.ts— o arquivo real do serviço; -
task.service.spec.ts— um arquivo de teste (pode ser excluído).
Veja o conteúdo inicial de task.service.ts:
task-service.ts
O decorador @Injectable informa ao Angular que este serviço pode ser injetado em outras classes.
A parte providedIn: 'root' significa que o Angular irá registrar automaticamente o serviço no módulo raiz e criar uma única instância dele para todo o aplicativo.
Singleton é um padrão de projeto que garante que uma classe tenha apenas uma instância e fornece um ponto global de acesso a ela.
Componente A, Componente B ou qualquer outro componente — todos eles receberão a mesma instância do serviço. Isso é muito conveniente porque permite armazenar dados compartilhados (como uma lista de tarefas) e evitar duplicação de lógica.
Por isso, um serviço se torna a única fonte de verdade para uma parte específica da lógica ou dos dados do seu aplicativo. Se houver interesse, é possível saber mais sobre o padrão singleton neste artigo.
Adicionando Lógica ao Serviço
Vamos avançar para a construção da lógica do seu serviço. Veja o que ele deve fazer:
-
Armazenar uma lista de tarefas;
-
Retornar a lista de tarefas;
-
Excluir tarefas;
-
Alternar o status de conclusão das tarefas.
Primeiro, vamos definir como é uma tarefa criando uma interface TypeScript:
task-interface.ts
Esta interface ajuda a definir claramente a estrutura de uma tarefa — inclui um id, um título e um status de conclusão. Você ainda não utilizou interfaces, mas adicionar uma aqui torna o código mais fácil de entender e trabalhar.
Agora vamos construir o serviço que gerencia sua lista de tarefas:
task-service.ts
Neste exemplo, os dados das tarefas são armazenados diretamente no código dentro de um array privado tasks.
Para permitir que outras partes da aplicação acessem a lista de tarefas, utiliza-se o método getTasks(). Ele retorna uma cópia do array usando a sintaxe spread ([...]), o que ajuda a proteger os dados originais contra alterações acidentais.
O método deleteTask(id: number) remove uma tarefa filtrando aquela com o ID correspondente, atualizando a lista.
Outro método importante é o toggleTaskStatus(id: number). Ele localiza a tarefa pelo seu ID e alterna seu status de conclusão — se a tarefa estava marcada como concluída (true), torna-se não concluída (false), e vice-versa.
Você pode reconhecer grande parte dessa lógica do seu TaskListComponent. Agora, tudo foi movido para o TaskService, o que ajuda a organizar seus componentes e mantém a lógica centralizada.
Este serviço agora é a base que permite que seus componentes interajam com a lista de tarefas — sem duplicar a lógica.
1. Por que criar um serviço no Angular?
2. O que significa providedIn: 'root' no decorador @Injectable?
3. Por que você retorna [...this.tasks] em vez de apenas this.tasks em getTasks()?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 3.13
Criando um Serviço Personalizado no Angular
Deslize para mostrar o menu
Criando um Serviço
O Angular fornece um comando de CLI conveniente para gerar rapidamente um serviço, configurando os arquivos e importações necessários:
Após executar este comando, o Angular cria dois arquivos:
-
task.service.ts— o arquivo real do serviço; -
task.service.spec.ts— um arquivo de teste (pode ser excluído).
Veja o conteúdo inicial de task.service.ts:
task-service.ts
O decorador @Injectable informa ao Angular que este serviço pode ser injetado em outras classes.
A parte providedIn: 'root' significa que o Angular irá registrar automaticamente o serviço no módulo raiz e criar uma única instância dele para todo o aplicativo.
Singleton é um padrão de projeto que garante que uma classe tenha apenas uma instância e fornece um ponto global de acesso a ela.
Componente A, Componente B ou qualquer outro componente — todos eles receberão a mesma instância do serviço. Isso é muito conveniente porque permite armazenar dados compartilhados (como uma lista de tarefas) e evitar duplicação de lógica.
Por isso, um serviço se torna a única fonte de verdade para uma parte específica da lógica ou dos dados do seu aplicativo. Se houver interesse, é possível saber mais sobre o padrão singleton neste artigo.
Adicionando Lógica ao Serviço
Vamos avançar para a construção da lógica do seu serviço. Veja o que ele deve fazer:
-
Armazenar uma lista de tarefas;
-
Retornar a lista de tarefas;
-
Excluir tarefas;
-
Alternar o status de conclusão das tarefas.
Primeiro, vamos definir como é uma tarefa criando uma interface TypeScript:
task-interface.ts
Esta interface ajuda a definir claramente a estrutura de uma tarefa — inclui um id, um título e um status de conclusão. Você ainda não utilizou interfaces, mas adicionar uma aqui torna o código mais fácil de entender e trabalhar.
Agora vamos construir o serviço que gerencia sua lista de tarefas:
task-service.ts
Neste exemplo, os dados das tarefas são armazenados diretamente no código dentro de um array privado tasks.
Para permitir que outras partes da aplicação acessem a lista de tarefas, utiliza-se o método getTasks(). Ele retorna uma cópia do array usando a sintaxe spread ([...]), o que ajuda a proteger os dados originais contra alterações acidentais.
O método deleteTask(id: number) remove uma tarefa filtrando aquela com o ID correspondente, atualizando a lista.
Outro método importante é o toggleTaskStatus(id: number). Ele localiza a tarefa pelo seu ID e alterna seu status de conclusão — se a tarefa estava marcada como concluída (true), torna-se não concluída (false), e vice-versa.
Você pode reconhecer grande parte dessa lógica do seu TaskListComponent. Agora, tudo foi movido para o TaskService, o que ajuda a organizar seus componentes e mantém a lógica centralizada.
Este serviço agora é a base que permite que seus componentes interajam com a lista de tarefas — sem duplicar a lógica.
1. Por que criar um serviço no Angular?
2. O que significa providedIn: 'root' no decorador @Injectable?
3. Por que você retorna [...this.tasks] em vez de apenas this.tasks em getTasks()?
Obrigado pelo seu feedback!