Ketika menghasilkan layanan di CLI Angular, itu menambahkan metadata tambahan dengan properti 'disediakan' dengan default 'root' untuk dekorator injeksi.
@Injectable({
providedIn: 'root',
})
Apa sebenarnya yang disediakan di lakukan? Saya berasumsi ini membuat layanan tersedia seperti layanan singleton tipe 'global' untuk seluruh aplikasi, namun, tidak akan lebih bersih untuk mendeklarasikan layanan seperti itu dalam array penyedia AppModule?
MEMPERBARUI:
Untuk orang lain, paragraf berikut memberikan penjelasan yang baik tentang itu juga, khususnya jika Anda ingin memberikan layanan Anda hanya ke modul fitur.
Sekarang ada cara baru, yang disarankan, untuk mendaftarkan penyedia, langsung di dalam
@Injectable()
dekorator, menggunakanprovidedIn
atribut baru . Ini menerima'root'
sebagai nilai atau modul aplikasi Anda. Saat Anda menggunakan'root'
, Andainjectable
akan terdaftar sebagai singleton dalam aplikasi, dan Anda tidak perlu menambahkannya ke penyedia modul root. Demikian pula, jika Anda menggunakanprovidedIn: UsersModule
,injectable
terdaftar sebagai penyediaUsersModule
tanpa menambahkannya keproviders
modul. "- https://blog.ninja-squad.com/2018/05/04/what-is-new-angular -6 /
PEMBARUAN 2:
Setelah penyelidikan lebih lanjut, saya memutuskan hanya berguna untuk memilikinya providedIn: 'root'
Jika Anda ingin provide
layanan dalam modul apa pun selain modul root, maka Anda lebih baik menggunakan providers
array di dekorator modul fitur, jika tidak, Anda akan terganggu dengan dependensi melingkar. Diskusi menarik bisa didapat di sini - https://github.com/angular/angular-cli/issues/10170
Jawaban:
jika Anda menggunakan providedIn, suntikan terdaftar sebagai penyedia Modul tanpa menambahkannya ke penyedia modul.
Dari
Docs
sumber
providedIn
atribut untuk menentukan di mana layanan harus diinisialisasi saat menggunakan@Injectable()
dekorator. Maka Anda harus menghapusnya dari atribut penyediaNgModule
deklarasi Anda serta pernyataan impornya. Ini dapat membantu mengurangi ukuran bundel dengan menghapus kode yang tidak digunakan dari bundel.providedIn: 'root'
adalah cara termudah dan paling efisien untuk menyediakan layanan sejak Angular 6:Untuk informasi lebih lanjut, pertimbangkan membaca dokumentasi dan FAQ NgModule
Btw:
providers
array dari NgModule sebagai gantinya.sumber
Dari Documents
Menandai kelas sebagai tersedia untuk Injector untuk pembuatan.
Layanan itu sendiri adalah kelas yang dihasilkan CLI dan yang didekorasi dengan @Injectable ().
Menentukan injeksi mana yang akan memberikan injeksi, dengan mengaitkannya dengan @NgModule atau InjectorType lainnya, atau dengan menentukan bahwa injeksi ini harus disediakan dalam injector 'root', yang akan menjadi injector tingkat aplikasi di sebagian besar aplikasi.
Saat Anda menyediakan layanan di tingkat akar, Angular membuat satu contoh layanan bersama dan menyuntikkannya ke kelas apa pun yang memintanya. Mendaftarkan penyedia di @adjectable () metadata juga memungkinkan Angular untuk mengoptimalkan aplikasi dengan menghapus layanan dari aplikasi yang dikompilasi jika tidak digunakan.
Dimungkinkan juga untuk menentukan bahwa layanan harus disediakan dalam @NgModule tertentu. Misalnya, jika Anda tidak ingin layanan tersedia untuk aplikasi kecuali mereka mengimpor modul yang Anda buat, Anda dapat menentukan bahwa layanan tersebut harus disediakan dalam modul
Metode ini lebih disukai karena memungkinkan Tree-shaking ( Tree shaking adalah langkah dalam proses build yang menghapus kode yang tidak digunakan dari basis kode ) layanan jika tidak ada yang menyuntikkannya.
Jika tidak mungkin untuk menentukan dalam layanan mana modul harus menyediakannya, Anda juga dapat mendeklarasikan penyedia untuk layanan dalam modul:
sumber
@Injectable()
?asalkan memberitahu Angular bahwa injektor root bertanggung jawab untuk membuat turunan dari Layanan Anda. Layanan yang disediakan dengan cara ini disediakan secara otomatis untuk seluruh aplikasi dan tidak perlu dicantumkan dalam modul apa pun.
Kelas layanan dapat bertindak sebagai penyedia mereka sendiri dan itulah sebabnya mendefinisikan mereka di dekorator @Injectable adalah semua pendaftaran yang Anda butuhkan.
sumber
Menurut
Documentation
:sumber