angular - [...] için tüm parametreler çözümlenemiyor


Oldukça yaygın bir sorun gibi görünüyor. Service2'de Service1'i kullanmak istiyorum ve istisna alıyorum

Hata: ILIASRestProvider için tüm parametreler çözülemedi: (Http, ?).

diğer Bileşenlerde Service2 enjekte edilebilir gibi görünse de. Ve sanırım her şeyi bir araya getirdim:

  • @Injectable Service1 ve Service2 üzerinde
  • tsconfig.json emitDecoratorMetadata true olarak ayarlandı
  • ngModule'ün Providers bölümünde Service1 ve Service2 kaydedildi

Eğer önemliyse: Bir Ionic 2 RC0 Uygulaması inşa ediyorum. İşte önemli dosyalar:

app.module.ts

import { NgModule } from '@angular/core';
import { IonicApp, IonicModule } from 'ionic-angular';
import { MyApp } from './app.component';
import {AppConfig} from "../config/app-config";
import {ConnectionService} from "../services/ilias-app.service";
import {ILIASRestProvider} from "../providers/ilias-rest.provider";
import {MigrationsService} from "../services/migrations.service";
import {FooterToolbarService} from "../services/footer-toolbar.service";
import {ObjectListPage} from "../pages/object-list/object-list";
import {FavoritesPage} from "../pages/favorites/favorites";
import {NewObjectsPage} from "../pages/new-objects/new-objects";
import {SettingsPage} from "../pages/settings/settings";
import {InfoPage} from "../pages/info/info";
import {LogoutPage} from "../pages/logout/logout";
import {SynchronizationService} from "../services/synchronization.service";
import {DataProvider} from "../providers/data-provider.provider";
import {FileService} from "../services/file.service";
import {DataProviderFileObjectHandler} from "../providers/handlers/file-object-handler";
import {TranslatePipe} from "ionic-angular/index";
import {FileSizePipe} from "../pipes/fileSize.pipe";
import {HttpModule, Http} from '@angular/http';
import {TranslateModule} from 'ng2-translate/ng2-translate';
import {TranslateLoader} from "ng2-translate/src/translate.service";
import {TranslateStaticLoader} from "ng2-translate/src/translate.service";

@NgModule({
  declarations: [
    MyApp,
    ObjectListPage,
    FavoritesPage,
    NewObjectsPage,
    SettingsPage,
    InfoPage,
    LogoutPage,
    FileSizePipe,
    TranslatePipe
  ],
  imports: [
    HttpModule,
    IonicModule.forRoot(MyApp, {prodMode: window.hasOwnProperty('cordova')}),
    TranslateModule.forRoot({
      provide: TranslateLoader,
      useFactory: (http: Http) => new TranslateStaticLoader(http, '/assets/i18n', '.json'),
      deps: [Http]
    })
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    ObjectListPage,
    FavoritesPage,
    NewObjectsPage,
    SettingsPage,
    InfoPage,
    LogoutPage
  ],
  providers: [
    AppConfig,
    ConnectionService, //<-----------------------
    MigrationsService,
    ILIASRestProvider, //<-------------------------
    FooterToolbarService,
    DataProvider,
    FileService,
    SynchronizationService,
    DataProviderFileObjectHandler
  ]
})
export class AppModule {}

ilias-rest.sağlayıcı.ts

@Injectable()
export class ILIASRestProvider {

    public constructor(private http:Http, public app:ConnectionService) {
    }
    ...
}

ilias-uygulama.servis.ts

@Injectable()
export class ConnectionService {

    ...

    constructor(public _config:AppConfig) {
        this._database = SQLiteDatabaseService.instance();
    }

    ...
}

uygulama-konfigürasyonu.ts

@Injectable()
export class AppConfig {

    protected data:any = {};

    constructor(public http:Http) {
    }

    ...
}

ionic kurulumu

Your system information:

Cordova CLI: 5.4.1
Ionic Framework Version: 2.0.0-rc.0
Ionic CLI Version: 2.1.0
Ionic App Lib Version: 2.1.0-beta.1
OS: Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS 
Node Version: v6.6.0

Cevap #1

Öncelikle önereceğim şey, ideal yol olduğu için varillerden ziyade dosyalardan doğrudan içe aktarmaktır.

import {HttpModule, Http} from '@angular/http'; 
import {ConnectionService} from "../services/ilias-app.service";

@Injectable()
export class ILIASRestProvider {

public constructor(private http:Http, public app:ConnectionService) {
}
...
}

İkinci olarak, eğer yukarıdaki çözüm projenizle mümkün değilse, lütfen import ifadelerinin sırasını değiştirin. Doğru sırada değiller. Örneğin http, ILIASRestProvider'da kullanılmaktadır ve ILIASRestProvider'dan önce import edilmelidir.

Umarım bu yardımcı olur

Cevap #2

İş yerinde burada aynı problemi yaşadım. Sorun, dosyalar arasında döngüsel bir bağımlılık olmamızdı.

  1. SignInComponent bir birim testinde test ediliyordu
  2. SignInComponent AuthService kullandı
  3. AuthService Routes.ts dosyasını kullandı
  4. Routes.ts, bileşeni olarak SignInComponent olan bir rota tanımladı

Enjeksiyon sisteminin bir örneğini oluşturamadığı şeyin adını veremediğinde ve basitçe adı '"?"' olarak verdiğinde bunun bir problem olduğunu anlayabilirsiniz.