C'est mon dernier recours après plusieurs heures de configuration d'un AOT personnalisé dans un projet Angular 7 sans CLI et débogage, j'ai eu
import 'core-js/es7/reflect';
import 'zone.js/dist/zone';
import { platformBrowser } from '@angular/platform-browser';
import { AppModule } from './app/app.module';
/**
* Enable production mode. Disable Angular's development mode, which turns off assertions and other
* checks within the framework.
*/
import { enableProdMode } from '@angular/core';
// enable production mode and thus disable debugging information
enableProdMode();
platformBrowser().bootstrapModule(<any>AppModule)
.catch(err => console.error(err));Ceci est mon app.module.ts p >
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Response } from '@angular/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AppService {
theme: string = '';
constructor (private http: HttpClient) { }
setSidebarPref(obj: object): Observable<any> {
return this.http.put('../api/v1.0/users/me/preferences', { 'batch' : obj }, { withCredentials: true } );
}
getUserImage(): Observable<any> {
return this.http.get('../api/v1.0/users/me/image', { responseType: 'blob', withCredentials: true });
}
getLayoutPreferences(): Observable<any> {
return this.http.get('../api/v1.0/properties/layout', { withCredentials: true });
}
handleError(error: Response) {
console.log(error);
return Observable.throw(error.json().error || 'Server error');
}
}
Ceci est mon composant
import { Component, OnInit } from '@angular/core';
import { AppService } from './services/app.service';
import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'kpi-main',
templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {
theme: string;
sidebarPref: object = {};
stickyHeader: string = '';
user: object = {};
constructor (private appService: AppService, private translate: TranslateService) {
// this language will be used as a fallback when a translation isn't found in the current language
translate.setDefaultLang('en');
// the lang to use, if the lang isn't available, it will use the current loader to get them
translate.use('en');
}
ngOnInit(): void {
this.appService.getLayoutPreferences().subscribe(layout => {
this.theme = layout.theme.value;
this.sidebarPref = layout.sidebar_small;
this.stickyHeader = layout.stickyHeader.visible;
this.user = layout.sidebar_small.user;
});
}
}
et mon service est
import { AppComponent } from './app.component';
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { InlineSVGModule } from 'ng-inline-svg';
import { APP_BASE_HREF } from '@angular/common';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { FeatureRoutingModule } from './app-routing.module';
/**
* Core
*/
import { HeaderComponent } from './core/header/header.component';
import { AppSettingsComponent } from './core/header/app-settings/app-settings.component';
import { SidebarComponent } from './core/sidebar/sidebar.component';
import { PreloaderComponent } from './core/preloader/preloader.component';
import { TranslationLoader } from './services/translation.service';
/**
* Shared
*/
import { PopupsDirective } from './shared/popups/popups.directive';
/**
* Component
*/
import { StructureComponent } from './component/structure/structure.component';
import { OverviewComponent } from './component/overview/overview.component';
import { MainContentComponent } from './component/main-content/main-content.component';
import { NavigationStripeComponent } from './component/main-content/navigation-stripe/navigation-stripe.component';
import { TestDirective } from './component/tooltip/serviceCalls.directive';
import { TooltipService } from './component/tooltip/tooltip.service';
import { TooltipComponent } from './component/tooltip/tooltip.component';
export function HttpLoaderFactory(http: HttpClient) {
return new TranslationLoader(http);
}
@NgModule({
// rendering in browser environment
imports: [
BrowserModule,
FeatureRoutingModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: (HttpLoaderFactory),
deps: [HttpClient]
}
}),
InlineSVGModule.forRoot(),
HttpClientModule
],
// register services at root level
providers: [
TooltipService,
{ provide: APP_BASE_HREF, useValue: `${window['_app_base']}/` || '/' }
],
// components declarations
declarations: [
AppComponent,
HeaderComponent,
AppSettingsComponent,
SidebarComponent,
PreloaderComponent,
StructureComponent,
OverviewComponent,
MainContentComponent,
TestDirective,
TooltipComponent,
PreloaderComponent,
PopupsDirective,
NavigationStripeComponent
],
// bootstrap component
bootstrap: [AppComponent]
})
export class AppModule {
}
Ce code sur mon application reçoit l'exception Null-injector que vous avez vue dans le lien en haut de ma question. Et cette erreur n'est générée que lors de l'exécution en mode production (j'ai désactivé UglifyJsPlugin pour obtenir un meilleur message d'erreur mais on ne sait toujours pas ce qui ne va pas)
Quelqu'un peut-il me dire ce que je manque sur mes fichiers dans pour avoir une configuration de service réussie?
PS: Faites-moi savoir si vous avez besoin de fichiers supplémentaires à vérifier.
Mettre à jour Après quelques recherches, j'ai découvert que le problème se trouvait dans mon fichier main-aot.ts et la façon dont ngfactory est créé. C'est mon nouveau point de départ et voici le fichier
Uncaught Error: StaticInjectorError(Platform: core)[function(){}]:
NullInjectorError: No provider for function(){}!
at t.get (injector.ts:43)
at injector.ts:346
at Xa (injector.ts:288)
at t.get (injector.ts:168)
at Cp (application_ref.ts:41)
at t.bootstrapModule (application_ref.ts:262)
at Object.<anonymous> (main-aot.ts:14)
at n (bootstrap:19)
at bootstrap:83
at bootstrap:83
3 Réponses :
Dans votre importation TranslateModule , vous passez entre parenthèses (ce qui est probablement une fonction) au lieu d'une classe pour loader.useFactory :
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
// useFactory: (HttpLoaderFactory), <- Here
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
}),
// ...
Malheureusement, cela n'a pas résolu le problème. De plus, useFactory: (HttpLoaderFactory) a été ajouté en fonction de leur document github.com / ngx-translate / core # aot
Oops! Je n'ai jamais utilisé ngx-translate auparavant, donc j'ai pensé que c'était pour spécifier des injecteurs.
J'ai trouvé une réponse ici si quelqu'un est confronté au même problème. Même si le problème signalé ne correspond pas à ce que j'ai rencontré, la réponse de ckapilla a résolu mon problème.
@ngtools \ webpack AOT ne fonctionne pas OU se fige à 95% d'émission
J'ai eu le même problème mais j'ai résolu en supprimant des injecteurs supplémentaires du fichier tsconfig.json
parce que j'ai été ajouté des éléments supplémentaires dans ce fichier. par exemple: "disableTypeScriptVersionCheck": true
like
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"downlevelIteration": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"module": "esnext",
"moduleResolution": "node",
"importHelpers": true,
"target": "es2015",
"skipLibCheck": true,
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2018",
"dom"
]
}
}
changé en
{
"angularCompilerOptions": {
"disableTypeScriptVersionCheck": true
},
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"downlevelIteration": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"module": "esnext",
"moduleResolution": "node",
"importHelpers": true,
"target": "es2015",
"skipLibCheck": true,
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2018",
"dom"
]
}
}
J'espère que cela vous sera utile