Saya telah membangun aplikasi dasar di Angular 2, tetapi saya telah menemukan masalah aneh di mana saya tidak dapat menyuntikkan layanan ke salah satu komponen saya. Ini menyuntikkan dengan baik ke salah satu dari tiga komponen lain yang telah saya buat.
Sebagai permulaan, ini adalah layanan:
import { Injectable } from '@angular/core';
@Injectable()
export class MobileService {
screenWidth: number;
screenHeight: number;
constructor() {
this.screenWidth = window.outerWidth;
this.screenHeight = window.outerHeight;
window.addEventListener("resize", this.onWindowResize.bind(this) )
}
onWindowResize(ev: Event) {
var win = (ev.currentTarget as Window);
this.screenWidth = win.outerWidth;
this.screenHeight = win.outerHeight;
}
}
Dan komponen yang menolak untuk bekerja dengannya:
import { Component, } from '@angular/core';
import { NgClass } from '@angular/common';
import { ROUTER_DIRECTIVES } from '@angular/router';
import {MobileService} from '../';
@Component({
moduleId: module.id,
selector: 'pm-header',
templateUrl: 'header.component.html',
styleUrls: ['header.component.css'],
directives: [ROUTER_DIRECTIVES, NgClass],
})
export class HeaderComponent {
mobileNav: boolean = false;
constructor(public ms: MobileService) {
console.log(ms);
}
}
Kesalahan yang saya dapatkan di konsol browser adalah ini:
PENGECUALIAN: Tidak dapat menyelesaikan semua parameter untuk HeaderComponent: (?).
Saya memiliki layanan dalam fungsi bootstrap sehingga ia memiliki penyedia. Dan saya tampaknya dapat menyuntikkannya ke dalam konstruktor komponen saya yang lain tanpa masalah.
angular
angular2-di
Keith Otto
sumber
sumber
'../'
sebuahindex.ts
(Barrel)? Bisakah Anda mencoba mengimpornya dari file yang dideklarasikan langsung?Jawaban:
Impor dari file yang dinyatakan langsung bukan pada laras.
Saya tidak tahu persis apa yang menyebabkan masalah ini tetapi saya melihatnya beberapa kali (mungkin semacam ketergantungan sirkuler).
Itu juga harus diperbaiki dengan mengubah urutan ekspor dalam barel (tidak tahu detail, tetapi disebutkan juga)
sumber
2.0.2
). Saya menemukan barel masih berguna, khususnya ketika saya perlu mengimpor beberapa model dan layanan antara modul yang berbeda. Iniimport { cleanValues, getState, FirebaseService, NotificationService, ... } from '../../shared/services';
adalah rasa sakit ketika tidak berhasil (;NgModule
ada bantuan dengan layanan singleton ...Selain jawaban sebelumnya yang diberikan, tampaknya kesalahan ini juga terjadi ketika layanan injeksi Anda tidak ada
@Injectable()
dekorator yang . Jadi sebelum Anda men-debug hal ketergantungan siklik dan urutan impor / ekspor Anda, lakukan pemeriksaan sederhana apakah layanan Anda benar-benar telah@Injectable()
ditentukan.Ini berlaku untuk Angular terbaru saat ini, Angular 2.1.0.
Saya membuka masalah tentang hal ini .
sumber
Router
dari '@ angular / router' dan tanpa injeksi itu, kesalahan ini akan selalu terjadi (segera setelah Anda memutuskan untuk membuat satu baris dari penggunaan kode router yang disuntikkan@injectable()
tidak diperlukan. Yang merupakan keanehan lain pada dirinya sendiri. Untuk ukuran yang baik saya masih menambahkannya, hanya ketika Anda harus memutuskan untuk menyuntikkan sesuatu.Pada Angular
2.2.3
sekarang adaforwardRef()
fungsi utilitas yang memungkinkan Anda untuk menyuntikkan penyedia yang belum ditentukan.Dengan tidak didefinisikan, maksud saya bahwa peta injeksi ketergantungan tidak tahu pengenal. Inilah yang terjadi selama dependensi melingkar. Anda dapat memiliki dependensi melingkar dalam Angular yang sangat sulit untuk dilepaskan dan dilihat.
Menambahkan
@Inject(forwardRef(() => MobileService))
ke parameter konstruktor dalam kode sumber pertanyaan asli akan memperbaiki masalah.Referensi
Manual Angular 2: ForwardRef
Teruskan referensi dalam Angular 2
sumber
forwardRef()
sudah ada di alpha ;-) Ini hanya diperlukan jikaMobile
layanan dinyatakan lebih jauh di file yang sama. Jika kelas ada di file yang berbeda, tidak perluforwardRef()
forwardRef()
itu membantu menghilangkanCan't resolve all parameters for ...
pesan tersebut. Setidaknya komponen berfungsi saat saya mencari solusi yang lebih baik untuk masalah ini. (Dan ya, dependensi gagal diimpor langsung dari file-nya)forwardRef
. Sangat sulit ditemukan. Butuh saya sepanjang hari kemarin untuk menyelesaikan masalah ini.foreardRef
diri saya tetapi tidak lagi setelahNgModule
diperkenalkan. Saya tidak khawatir kehilangan repetisi. Saya hanya ingin tahu mengapa Anda mengalami ini setelah ini tidak muncul lagi sejak beberapa bulan. Saya akan melihat lebih dekat ketika saya kembali ke rumah dalam beberapa hari. Terima kasih banyak atas umpan baliknya.SALAH # 1: Lupa Penghias:
SALAH # 2: Menghilangkan Simbol "@":
SALAH # 3: Menghilangkan Simbol "()":
SALAH # 4: Huruf kecil "i":
SALAH # 5: Anda lupa: impor {injectable} dari '@ angular / core';
BENAR:
sumber
Seperti yang telah dinyatakan, masalah ini disebabkan oleh pemesanan ekspor dalam barel yang disebabkan oleh dependensi melingkar.
Penjelasan lebih rinci ada di sini: https://stackoverflow.com/a/37907696/893630
sumber
Saya juga mengalami ini dengan menyuntikkan layanan A ke layanan B dan sebaliknya.
Saya pikir ini hal yang baik bahwa ini gagal dengan cepat karena mungkin harus dihindari . Jika Anda ingin layanan Anda menjadi lebih modular dan dapat digunakan kembali, yang terbaik adalah menghindari referensi melingkar sebanyak mungkin. Posting ini menyoroti jebakan di sekitarnya.
Karena itu, saya memiliki rekomendasi berikut:
EventService
) yang dapat disuntikkan oleh kedua layanan untuk bertukar pesan.sumber
Untuk kepentingan pencari; Saya mendapat kesalahan ini. Itu hanya simbol @ yang hilang.
Yaitu ini menghasilkan
Can't resolve all parameters for MyHttpService
kesalahan.Menambahkan
@
simbol yang hilang akan memperbaikinya.sumber
Dalam kasus saya, saya perlu menambahkan
import "core-js/es7/reflect";
aplikasi saya untuk membuat@Injectable
pekerjaan.sumber
Kemungkinan lain adalah tidak
emitDecoratorMetadata
disetel ke true di tsconfig.jsonsumber
Anda mendapatkan kesalahan ini jika Anda memiliki layanan A yang tergantung pada properti statis / metode layanan B dan layanan B itu sendiri tergantung pada layanan A melalui injeksi ketergantungan. Jadi itu semacam ketergantungan melingkar, meskipun bukan karena properti / metode statis. Mungkin bug yang terjadi dalam kombinasi dengan AOT .
sumber
A -> B
dan keduanya menggunakan kelas statis yang sama. Solusi denganforwardRef
bantuan, tapi saya akan melihat bagaimana ini bisa diuraikan. Saya mungkin akan mencoba membuat layanan nyata dari kelas statis ini (ini akan mengarah pada desain yang lebih baik juga).Selain
@Injectable()
dekorator yang hilang@Injectable()
Dekorator yang hilang di kelas abstrak menghasilkan Tidak bisa menyelesaikan semua parameter untuk layanan: (?) Dekorator harus ada di dalamMyService
maupun di kelas turunanBaseService
sumber
Dalam kasus saya, itu terjadi karena saya tidak mendeklarasikan tipe untuk parameter konstruktor.
Saya punya sesuatu seperti ini:
dan kemudian mengubahnya ke kode di bawah ini memecahkan masalah saya.
sumber
bagi saya itu hanya kekurangan
()
di @Injectable. Proper adalah @Injectable ()sumber
Menghapus parameter dari metode konstruktor () yang dapat dipecahkan menyelesaikannya untuk kasus saya.
sumber
Dalam kasus saya itu karena plugin Augury, nonaktifkan itu akan berfungsi dengan baik. Pilihan alternatif adalah aot, juga berfungsi.
semua kredit ke @ Boboss74, ia memposting jawabannya di sini: https://github.com/angular/angular/issues/23958
sumber
Bagi saya masalahnya lebih menyebalkan, saya menggunakan layanan di dalam layanan dan lupa menambahkannya sebagai ketergantungan pada appModule! Semoga ini membantu seseorang menghemat beberapa jam memecah aplikasi hanya untuk membangunnya kembali
sumber
@Inject
anotasi. Saya mengabaikan apa yang dikatakan pesan kesalahan itu sedikit. Jika Anda tidak mencurigai dependensi melingkar, buka saja kelas yang disebutkan dalam kesalahan dan lihat semua parameter konstruktor dan setiap anggota kelas yang dianotasi dengan@Inject
dan pastikan Anda melakukan DI dengan benar pada semuanya. Lebih lanjut tentang DI di sini: angular.io/docs/ts/latest/guide/dependency-injection.htmlAnda harus menambahkan array penyedia di dekorator @Component atau dalam modul tempat komponen Anda dideklarasikan. Di dalam komponen Anda dapat melakukan seperti di bawah ini:
sumber
Dalam kasus saya melewatkan parameter yang salah ke konstruktor menghasilkan kesalahan ini, ide dasar tentang kesalahan ini adalah bahwa Anda tanpa sadar melewati beberapa argumen salah untuk fungsi apa pun.
Saya memecahkan ini dengan hanya menghapus argumen itu.
sumber
Bagi saya, saya mendapatkan kesalahan ini ketika saya keliru menonaktifkan impor ini dalam file polyfills.ts, Anda harus memastikan itu diimpor untuk menghindari kesalahan itu.
sumber
Dalam kasus saya, saya mencoba memperluas "
NativeDateAdapter
" untuk menggantiformat(date: Date, displayFormat: Object)
metode " ".Di AngularMaterial-2 DatePicker.
Jadi pada dasarnya saya lupa menambahkan
@Injectable
anotasi.Setelah saya menambahkan ini ke kelas "CustomDateAdapter" saya:
Kesalahan telah terjadi.
sumber
Jawaban ini mungkin sangat membantu untuk masalah ini. Selain itu, untuk kasus saya, mengekspor layanan
default
adalah penyebabnya.SALAH:
BENAR:
sumber
Ini bisa menjadi masalah yang sangat sulit untuk di-debug karena kurangnya umpan balik dalam kesalahan. Jika Anda khawatir tentang ketergantungan siklik yang sebenarnya, berikut adalah hal paling penting untuk dilihat dalam pelacakan tumpukan a) nama layanan b) parameter konstruktor dalam layanan yang memiliki tanda tanya misalnya jika terlihat seperti ini:
maka itu berarti parameter ke-5 adalah layanan yang juga bergantung pada AuthService. yaitu tanda tanya, berarti itu tidak diselesaikan oleh DI.
Dari sana, Anda hanya perlu memisahkan 2 layanan dengan merestrukturisasi kode.
sumber
Saya mengalami kesalahan ini dengan salah ketik nama layanan, yaitu konstruktor (private myService: MyService ).
Untuk layanan yang salah eja, saya dapat menentukan layanan mana yang menjadi masalah (saya telah mendaftarkan beberapa di konstruktor) dengan memeriksa halaman di Chrome-> Console. Anda akan melihat sebagai bagian dari pesan daftar array "parameter" dengan menampilkan Object objek, Object object,? (atau semacam itu). Perhatikan di mana "?" adalah dan itu adalah posisi layanan yang menyebabkan masalah.
sumber
Meskipun pemesanan kelas yang diekspor dari dalam tong mungkin telah disebutkan, skenario berikut ini juga dapat menghasilkan efek yang sama.
Misalkan Anda memiliki kelas
A
,,B
danC
diekspor dari dalam file yang sama di manaA
tergantungB
danC
:Karena kelas dependen (yaitu dalam hal ini kelas
B
danC
) belum diketahui oleh Angular, ( mungkin pada saat run-time selama proses injeksi dependensi Angular pada kelasA
) kesalahan meningkat.Larutan
Solusinya adalah mendeklarasikan dan mengekspor kelas-kelas dependen sebelum kelas di mana DI dilakukan.
yaitu dalam kasus di atas kelas
A
dideklarasikan tepat setelah dependensinya didefinisikan:sumber
Dalam kasus saya, saya mengekspor Kelas dan Enum dari file komponen yang sama:
mComponent.component.ts
:Kemudian, saya mencoba menggunakan
MyEnum
dari seorang anakMyComponentClass
. Itu menyebabkan kesalahan Can't diselesaikan semua parameter .Dengan memindahkan
MyEnum
folder terpisah dariMyComponentClass
, itu memecahkan masalah saya!Seperti yang dikatakan Günter Zöchbauer, ini terjadi karena suatu layanan atau komponen tergantung secara melingkar.
sumber
Jika layanan Anda didefinisikan dalam file yang sama dengan komponen (yang mengkonsumsinya) dan layanan ditentukan setelahnya komponen dalam file Anda mungkin mendapatkan kesalahan ini. Ini karena masalah 'forwardRef' yang sama yang disebutkan orang lain. Saat ini VSCode tidak hebat menunjukkan kesalahan ini dan build berhasil dikompilasi.
Menjalankan build with
--aot
can mask masalah ini karena cara kerja kompiler (mungkin terkait dengan pengocokan pohon).Solusi: Pastikan layanan didefinisikan dalam file lain atau sebelum definisi komponen. (Saya tidak yakin apakah forwardRef dapat digunakan dalam kasus ini, tetapi tampaknya kikuk melakukannya).
Jika saya memiliki layanan yang sangat sederhana yang sangat kuat terkait dengan komponen (semacam model tampilan) - misalnya.
ImageCarouselComponent
, Saya boleh menamainyaImageCarouselComponent.service.ts
sehingga tidak ikut campur dengan layanan saya yang lain.sumber
Dalam kasus saya itu adalah referensi melingkar. Saya meminta MyService memanggil Myservice2 Dan MyService2 memanggil MyService.
Tidak baik :(
sumber
Dalam kasus saya, alasannya adalah sebagai berikut:
Akibatnya, ketika mencoba membuat objek A, konstruktor default gagal. Saya tidak tahu mengapa ini bukan kesalahan kompilasi.
Saya memperbaikinya dengan hanya menambahkan konstruktor di A, yang benar disebut konstruktor B.
sumber
Kena kau!
Jika tidak ada jawaban di atas yang membantu Anda, mungkin Anda mengimpor beberapa elemen dari file yang sama di mana komponen menyuntikkan layanan.
Saya jelaskan lebih baik:
Ini adalah file layanan :
Ini adalah file komponen :
Jadi itu menyebabkan masalah bahkan jika simbol tidak berada di dalam komponen yang sama, tetapi hanya di dalam file yang sama. Pindahkan simbol (bisa berupa fungsi, konstanta, kelas dan sebagainya ...) di tempat lain dan kesalahannya akan hilang
sumber
untuk versi sudut 6 dan yang lebih baru, coba
.. tepat di atas kelas layanan Anda tanpa garis lain di antaranya
keuntungan
[ dokumen sudut ]
sumber