Podczas generowania usług w Angular CLI, dodaje dodatkowe metadane z właściwością „dostarczone w” z domyślną wartością „root” dla dekoratora Injectable.
@Injectable({
providedIn: 'root',
})
Co dokładnie zapewnia? Zakładam, że oznacza to udostępnienie usługi jako pojedynczej usługi typu „globalnego” dla całej aplikacji, jednak czy deklarowanie takich usług w tablicy dostawców AppModule nie byłoby czystsze?
AKTUALIZACJA:
Dla wszystkich innych, poniższy akapit również zawiera inne dobre wyjaśnienie, w szczególności, jeśli chcesz świadczyć usługi tylko dla modułu funkcji.
Jest teraz nowy, zalecany sposób rejestracji dostawcy bezpośrednio w
@Injectable()
dekoratorze przy użyciu nowegoprovidedIn
atrybutu. Akceptuje'root'
jako wartość lub dowolny moduł aplikacji. Kiedy używasz'root'
, Twójinjectable
będzie zarejestrowany jako singleton w aplikacji i nie musisz go dodawać do dostawców modułu głównego. Podobnie, jeśli używaszprovidedIn: UsersModule
,injectable
jest zarejestrowany jako dostawcaUsersModule
bez dodawania go doproviders
modułu. ”- https://blog.ninja-squad.com/2018/05/04/what-is-new-angular -6 /
AKTUALIZACJA 2:
Po dalszych badaniach zdecydowałem, że warto mieć providedIn: 'root'
Jeśli chcesz skorzystać z provide
usługi w jakimkolwiek module innym niż moduł główny, lepiej użyj providers
tablicy w dekoratorach modułu funkcji, w przeciwnym razie będziesz nękany cyklicznymi zależnościami. Ciekawe dyskusje do przeprowadzenia tutaj - https://github.com/angular/angular-cli/issues/10170
Odpowiedzi:
w przypadku korzystania z providedIn, element iniekcyjny jest rejestrowany jako dostawca modułu bez dodawania go do dostawców modułu.
Z
Docs
źródło
providedIn
atrybutu do zdefiniowania, gdzie usługa powinna zostać zainicjowana podczas korzystania z@Injectable()
dekoratora. Następnie należy usunąć go z atrybutu dostawcyNgModule
deklaracji, a także instrukcji importu, co może pomóc w zmniejszeniu rozmiaru paczki poprzez usunięcie nieużywanego kodu z paczki.providedIn: 'root'
to najłatwiejszy i najbardziej efektywny sposób świadczenia usług od czasu Angular 6:Aby uzyskać dalsze informacje, rozważ przeczytanie dokumentacji i często zadawanych pytań dotyczących NgModule
Przy okazji:
providers
zamiast tego użyj tablicy NgModule.źródło
Z Dokumentów
Oznacza klasę jako dostępną dla wtryskiwacza do utworzenia.
Sama usługa jest klasą wygenerowaną przez CLI i udekorowaną za pomocą @Injectable ().
Określa, które wtryskiwacze będą dostarczać wstrzykiwacz, kojarząc go z @NgModule lub innym typem wtryskiwacza, albo określając, że ten wstrzykiwacz powinien być dostarczony we wtryskiwaczu „root”, który w większości aplikacji będzie wtryskiwaczem na poziomie aplikacji.
Kiedy udostępniasz usługę na poziomie głównym, Angular tworzy pojedyncze, współużytkowane wystąpienie usługi i wstrzykuje je do dowolnej klasy, która o to prosi. Zarejestrowanie dostawcy w metadanych @Injectable () umożliwia również Angularowi optymalizację aplikacji przez usunięcie usługi ze skompilowanej aplikacji, jeśli nie jest używana.
Możliwe jest również określenie, że usługa powinna być świadczona w określonym @NgModule. Na przykład, jeśli nie chcesz, aby usługa była dostępna dla aplikacji, chyba że zaimportują utworzony przez Ciebie moduł, możesz określić, że usługa ma być świadczona w module
Ta metoda jest preferowana, ponieważ umożliwia potrząsanie drzewem (potrząsanie drzewem jest krokiem w procesie budowania, który usuwa nieużywany kod z bazy kodu ) usługi, jeśli nic jej nie wstrzykuje.
W przypadku braku możliwości określenia w serwisie, który moduł ma to świadczyć, możesz również zadeklarować dostawcę usługi w ramach modułu:
źródło
@Injectable()
?providedIn informuje Angular, że iniektor główny jest odpowiedzialny za utworzenie wystąpienia Twojej usługi. Usługi świadczone w ten sposób są automatycznie udostępniane całej aplikacji i nie muszą być wymienione w żadnym module.
Klasy usług mogą działać jako ich własne dostawcy, dlatego zdefiniowanie ich w dekoratorze @Injectable to jedyna rejestracja, jakiej potrzebujesz.
źródło
Zgodnie z
Documentation
:źródło
zobacz Doskonałe wyjaśnienie @Nipuna,
Chciałbym go rozszerzyć o przykłady.
jeśli używasz dekoratora do wstrzykiwań bez
providedin
właściwości, takich jak,wtedy musiałbyś wpisać nazwę usługi w odpowiedniej
providers
tablicy modułu .lubię to;
data.service.ts ↴
app.module.ts ↴
Ale jeśli używasz
providedIn: 'root'
, w ten sposób:data.service.ts ↴
Wtedy nasz moduł wyglądałby tak:
app.module.ts ↴
zobaczyć ja did't dodać
DataService
wproviders
tablicy ten czas, bo to nie jest potrzebne.źródło