Skip to content

Commit e7d05ed

Browse files
committed
💬 feat: inseriu mais informações na documentação.
1 parent a16efb5 commit e7d05ed

File tree

2 files changed

+183
-28
lines changed

2 files changed

+183
-28
lines changed

README.md

Lines changed: 183 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,12 @@ This project was generated with [Angular CLI](https://github.com/angular/angular
4141
}
4242
];
4343

44-
// constructor(private logging: LoggingService) {
45-
46-
// }
47-
48-
updateStatus = new EventEmitter<string>();
49-
5044
onAccountAdded(name: string, status: string) {
5145
this.accounts.push({name: name, status: status});
52-
this.logging.changeStatus(status)
5346
}
5447

5548
onStatusChanged(id: number, newStatus: string) {
5649
this.accounts[id].status = newStatus;
57-
this.logging.changeStatus(newStatus)
5850
}
5951
}
6052
```
@@ -101,3 +93,186 @@ This project was generated with [Angular CLI](https://github.com/angular/angular
10193

10294
<p>Dessa maneira, quando o Angular constrói o componente, ele já cria uma instancia do serviço para ele.</p>
10395

96+
## Injetando serviços em serviços
97+
98+
<p>Para injetar um serviço em outro serviço, ou seja, utilizar um método ou qualquer outra parte de um serviço X em um serviço Y, é necessário que ambos estejam injetados no nível mais alto da aplicação, como mencionado anteriormente.</p>
99+
100+
<p>Primeiro, é necessário importar o serviço Y no serviço X e, dizer ao Angular que precisa da instância do serviço Y no serviço X:</p>
101+
102+
```javascript
103+
// other service
104+
import { LoggingService } from "./logging.service"; <------- Serviço Y
105+
106+
export class AccountService { <------ Serviço X
107+
108+
accounts = [
109+
{
110+
name: 'Master Account',
111+
status: 'active'
112+
},
113+
{
114+
name: 'Testaccount',
115+
status: 'inactive'
116+
},
117+
{
118+
name: 'Hidden Account',
119+
status: 'unknown'
120+
}
121+
];
122+
123+
constructor(private logging: LoggingService) { <----- Diz ao Angular que precisa da instância do serviço Y no serviço X
124+
125+
}
126+
127+
onAccountAdded(name: string, status: string) {
128+
this.accounts.push({name: name, status: status});
129+
this.logging.changeStatus(status)
130+
}
131+
132+
onStatusChanged(id: number, newStatus: string) {
133+
this.accounts[id].status = newStatus;
134+
this.logging.changeStatus(newStatus)
135+
}
136+
}
137+
```
138+
<p>No entanto, se esse código for utilizado dessa maneira, Angular retornará um erro. Isso ocorrerá, porque quando um serviço é injetado em algo, este algo precisa ter alguns metadados anexados à ele. Um componente em Angular, por exemplo, tem os seus metadados no '@Component'. Mas um serviço não tem um metadado, mas quando recebe a injeção de outro serviço ele precisa disso, de metadados específicos, para isso o Angular fornece o '@Injectable()'.</p>
139+
140+
```javascript
141+
// other service
142+
import { LoggingService } from "./logging.service";
143+
144+
@Injectable() <-------- Isso diz ao Angular que algo pode ser injetado aqui no serviço X
145+
146+
export class AccountService {
147+
148+
accounts = [
149+
{
150+
name: 'Master Account',
151+
status: 'active'
152+
},
153+
{
154+
name: 'Testaccount',
155+
status: 'inactive'
156+
},
157+
{
158+
name: 'Hidden Account',
159+
status: 'unknown'
160+
}
161+
];
162+
163+
constructor(private logging: LoggingService) {
164+
165+
}
166+
167+
onAccountAdded(name: string, status: string) {
168+
this.accounts.push({name: name, status: status});
169+
this.logging.changeStatus(status) <----- métodos do serviço Y sendo utilizado na execução de um método do serviço X
170+
}
171+
172+
onStatusChanged(id: number, newStatus: string) {
173+
this.accounts[id].status = newStatus;
174+
this.logging.changeStatus(newStatus) <----- métodos do serviço Y sendo utilizado na execução de um método do serviço X
175+
}
176+
}
177+
```
178+
179+
<p> O @Injectable() sempre deve ser adicionado ao serviço no qual vc quer injetar algo, e não no serviço a ser injetado. Mas, em algumas versões do Angular é recomendado utilizá-lo nos dois serviços.</p>
180+
181+
## Utilizando serviços para comunicação entre componentes
182+
183+
<p>Para realizar a comunicação entre componentes utilizando um serviço, você pode por xemplo, criar um EventEmitter em seu serviço, e emitir o tipo que você precisa acessar em outros componentes:</p>
184+
185+
```javascript
186+
187+
// injectable
188+
import { Injectable, EventEmitter } from "@angular/core";
189+
190+
// other service
191+
import { LoggingService } from "./logging.service";
192+
193+
@Injectable()
194+
195+
export class AccountService {
196+
197+
accounts = [
198+
{
199+
name: 'Master Account',
200+
status: 'active'
201+
},
202+
{
203+
name: 'Testaccount',
204+
status: 'inactive'
205+
},
206+
{
207+
name: 'Hidden Account',
208+
status: 'unknown'
209+
}
210+
];
211+
212+
constructor(private logging: LoggingService) {
213+
214+
}
215+
216+
updateStatus = new EventEmitter<string>(); <----- Evento que emite uma string
217+
218+
onAccountAdded(name: string, status: string) {
219+
this.accounts.push({name: name, status: status});
220+
this.logging.changeStatus(status)
221+
}
222+
223+
onStatusChanged(id: number, newStatus: string) {
224+
this.accounts[id].status = newStatus;
225+
this.logging.changeStatus(newStatus)
226+
}
227+
}
228+
```
229+
230+
<p>Após isso, basta acionar a emissão desse evento em algum componente:</p>
231+
232+
```javascript
233+
export class AccountComponent {
234+
@Input() account: {name: string, status: string};
235+
@Input() id: number;
236+
237+
constructor(private logging: LoggingService, private accountService: AccountService) {
238+
239+
}
240+
241+
onSetTo(status: string) {
242+
this.accountService.onStatusChanged(this.id, status)
243+
// this.logging.changeStatus(status)
244+
this.accountService.updateStatus.emit(status)
245+
}
246+
247+
}
248+
```
249+
250+
<p>E assinar/inscrever c/ o método subscribe() o que está sendo emitido, no componente que você deseja receber o dado/informação que foi emitido:<p>
251+
252+
```javascript
253+
export class NewAccountComponent {
254+
255+
constructor (private logging: LoggingService, private accountService: AccountService) {
256+
257+
this.accountService.updateStatus.subscribe(
258+
(status: string)=> alert("New status: " + status)
259+
);
260+
}
261+
}
262+
```
263+
264+
<p>Nos exemplos acima, no componente 'account', ao clicar em um dos botões que setam o estado da conta criada, o status dessa conta é emitido e no componente responsável por criar novas contas 'new-account', é recebido/assinado/ o status e acionado um alert.</p>
265+
266+
## Uma forma diferente de injetar serviços
267+
268+
<p> Para fornecer serviços em toda a aplicação de maneira mais eficiente, pensando em cenários em que os serviços forem utilizados em aplicações maiores, em vez de adicionar uma classe de serviço ao providers[] array em AppModule, você pode definir a seguinte configuração em @Injectable():
269+
270+
```javascript
271+
@Injectable({providedIn: 'root'})
272+
export class MyService { ... }
273+
```
274+
275+
<p>O uso desta sintaxe é totalmente opcional, a sintaxe tradicional (usando providers[]) também funcionará. Mas essa, oferece uma vantagem: os serviços podem ser carregados lentamente pelo Angular (nos bastidores) e o código redundante pode ser removido automaticamente. Isso pode levar a um melhor desempenho e velocidade de carregamento.</p>
276+
277+
## Conclusão
278+
<p>Certifique-se de utilizar apenas uma quantidade necessária de instâncias de serviços, sempre que for injetar serviços em serviços certifique-se de fornecer os serviços no nível mais alto da aplicação e de utilizar o '@Injectable()'.</p>

how-to-use.txt

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)