# Angular Services --- #### Motivation  🤮 --- #### Service 
kein UI
übernimmt
eine
Zuständigkeit
Datenhaltung
Abrufen externen Daten
...
--- #### Service ```typescript @Injectable({ providedIn: 'root' }) export class SomeService { // logic } ``` ```typescript @Component({ ... }) export class SomeComponent { service = inject(SomeService); } ```
Instanzierung durch Angular
einmalig (
Singleton
)
--- #### Datenhaltung ```typescript export class BasketService { basket = signal
([]); } ``` ```typescript export class ItemComponent { product = input.required
(); service = inject(BasketService); addToBasket() { this.service.basket.update(s => [...s, this.product()]); } } ``` ```typescript export class BasketComponent { service = inject(BasketService); basket = this.service.basket(); } ``` ---- #### Best Practice ```typescript export class BasketService { private _basket = signal
([]); readonly basket = this._basket.asReadonly(); addToBasket(product: Product) { this._basket.set([...this._basket(), product]); } ``` ```typescript export class ItemComponent { product = input.required
(); service = inject(BasketService); addToBasket() { this.service.addToBasket(this.product); } ``` ```typescript export class BasketComponent { service = inject(BasketService); basket = computed
(this.service.basket); ``` ---- #### `computed` ```typescript count = signal(2); doubleCount = computed(() => count() * 2); // 4 count.set(3) // count = 4, doubleCount = 6 ```
entstehen aus existierenden Signals
read-only
```typescript doubleCount.set(42); 🚫 ``` ```typescript computed(() => a() + b()); ```
updated, wenn
a
oder
b
updaten
lazy evaluated
gecached