Es ist nicht ratsam, die environment.*.tsDateien für Ihre API-URL-Konfiguration zu verwenden. Es scheint, als ob Sie sollten, weil dies das Wort "Umwelt" erwähnt.
Dies ist eine Konfiguration zur Kompilierungszeit . Wenn Sie die API-URL ändern möchten, müssen Sie sie neu erstellen. Das möchten Sie nicht tun müssen ... fragen Sie einfach Ihre freundliche QS-Abteilung :)
Was Sie benötigen, ist die Laufzeitkonfiguration , dh die App lädt ihre Konfiguration beim Start.
Einige andere Antworten berühren dies, aber der Unterschied besteht darin, dass die Konfiguration geladen werden muss, sobald die App gestartet wird , damit sie von einem normalen Dienst verwendet werden kann, wann immer sie benötigt wird.
So implementieren Sie die Laufzeitkonfiguration:
- Fügen Sie dem
/src/assets/Ordner eine JSON-Konfigurationsdatei hinzu (damit diese beim Erstellen kopiert wird).
- Erstellen Sie eine
AppConfigService, um die Konfiguration zu laden und zu verteilen
- Laden Sie die Konfiguration mit einem
APP_INITIALIZER
1. Fügen Sie die Konfigurationsdatei hinzu /src/assets
Sie können es einem anderen Ordner hinzufügen, müssen der CLI jedoch mitteilen, dass es sich um ein Asset in der handelt angular.json. Beginnen Sie mit dem Assets-Ordner:
{
"apiBaseUrl": "https://development.local/apiUrl"
}
2. Erstellen AppConfigService
Dies ist der Dienst, der injiziert wird, wenn Sie den Konfigurationswert benötigen:
@Injectable({
providedIn: 'root'
})
export class AppConfigService {
private appConfig: any;
constructor(private http: HttpClient) { }
loadAppConfig() {
return this.http.get('/assets/config.json')
.toPromise()
.then(data => {
this.appConfig = data;
});
}
// This is an example property ... you can make it however you want.
get apiBaseUrl() {
if (!this.appConfig) {
throw Error('Config file not loaded!');
}
return this.appConfig.apiBaseUrl;
}
}
3. Laden Sie die Konfiguration mit einem APP_INITIALIZER
Damit die AppConfigServiceKonfiguration bei vollständig geladener Konfiguration sicher injiziert werden kann, muss die Konfiguration beim Start der App geladen werden. Wichtig ist, dass die Factory-Funktion für die Initialisierung a zurückgeben muss, Promisedamit Angular warten kann, bis die Auflösung abgeschlossen ist, bevor der Start abgeschlossen wird:
NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule
],
providers: [
{
provide: APP_INITIALIZER,
multi: true,
deps: [AppConfigService],
useFactory: (appConfigService: AppConfigService) => {
return () => {
//Make sure to return a promise!
return appConfigService.loadAppConfig();
};
}
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
Jetzt können Sie es überall einspritzen, und die gesamte Konfiguration kann gelesen werden:
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.scss']
})
export class TestComponent implements OnInit {
apiBaseUrl: string;
constructor(private appConfigService: AppConfigService) {}
ngOnInit(): void {
this.apiBaseUrl = this.appConfigService.apiBaseUrl;
}
}
Ich kann es nicht stark genug sagen. Die Konfiguration Ihrer API-URLs als Konfiguration zur Kompilierungszeit ist ein Anti-Pattern . Verwenden Sie die Laufzeitkonfiguration.