You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+183-8Lines changed: 183 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -41,20 +41,12 @@ This project was generated with [Angular CLI](https://github.com/angular/angular
41
41
}
42
42
];
43
43
44
-
// constructor(private logging: LoggingService) {
45
-
46
-
// }
47
-
48
-
updateStatus =newEventEmitter<string>();
49
-
50
44
onAccountAdded(name:string, status:string) {
51
45
this.accounts.push({name: name, status: status});
52
-
this.logging.changeStatus(status)
53
46
}
54
47
55
48
onStatusChanged(id:number, newStatus:string) {
56
49
this.accounts[id].status= newStatus;
57
-
this.logging.changeStatus(newStatus)
58
50
}
59
51
}
60
52
```
@@ -101,3 +93,186 @@ This project was generated with [Angular CLI](https://github.com/angular/angular
101
93
102
94
<p>Dessa maneira, quando o Angular constrói o componente, ele já cria uma instancia do serviço para ele.</p>
103
95
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
+
exportclassAccountService { <------ 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(privatelogging: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>
@Injectable() <-------- Isso diz ao Angular que algo pode ser injetado aqui no serviço X
145
+
146
+
exportclassAccountService {
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(privatelogging: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>
<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
+
exportclassMyService { ... }
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>
0 commit comments