Ich möchte App Settings
meiner App einen Abschnitt hinzufügen, der einige Konstanten und vordefinierte Werte enthält.
Ich habe diese Antwort bereits gelesen , die verwendet. OpaqueToken
Aber sie ist in Angular veraltet. Dieser Artikel erklärt die Unterschiede, liefert jedoch kein vollständiges Beispiel, und meine Versuche waren erfolglos.
Folgendes habe ich versucht (ich weiß nicht, ob es der richtige Weg ist):
//ServiceAppSettings.ts
import {InjectionToken, OpaqueToken} from "@angular/core";
const CONFIG = {
apiUrl: 'http://my.api.com',
theme: 'suicid-squad',
title: 'My awesome app'
};
const FEATURE_ENABLED = true;
const API_URL = new InjectionToken<string>('apiUrl');
Und dies ist die Komponente, in der ich diese Konstanten verwenden möchte:
//MainPage.ts
import {...} from '@angular/core'
import {ServiceTest} from "./ServiceTest"
@Component({
selector: 'my-app',
template: `
<span>Hi</span>
` , providers: [
{
provide: ServiceTest,
useFactory: ( apiUrl) => {
// create data service
},
deps: [
new Inject(API_URL)
]
}
]
})
export class MainPage {
}
Aber es funktioniert nicht und ich bekomme Fehler.
Frage:
Wie kann ich "app.settings" -Werte auf Winkel-Weise konsumieren?
NB Sicher, ich kann einen injizierbaren Dienst erstellen und ihn in den Anbieter des NgModule stellen, aber wie gesagt, ich möchte es auf InjectionToken
Angular-Weise tun .
quelle
Antworten:
Ich habe herausgefunden, wie dies mit InjectionTokens gemacht wird (siehe Beispiel unten). Wenn Ihr Projekt mit dem erstellt wurde
Angular CLI
, können Sie die Umgebungsdateien/environments
für staticapplication wide settings
wie einen API-Endpunkt verwenden, aber abhängig von den Anforderungen Ihres Projekts werden Sie höchstwahrscheinlich enden Verwenden von beiden, da Umgebungsdateien nur Objektliterale sind, während eine injizierbare Konfiguration mitInjectionToken
's die Umgebungsvariablen verwenden kann und da es sich um eine Klasse handelt, kann Logik angewendet werden, um sie basierend auf anderen Faktoren in der Anwendung zu konfigurieren, z. B. anfängliche http-Anforderungsdaten, Subdomain , etc.Beispiel für Injektionstoken
/app/app-config.module.ts
/app/app.module.ts
Jetzt können Sie es einfach in eine beliebige Komponente, einen Dienst usw. integrieren:
/app/core/auth.service.ts
Sie können dann auch check the config mit der exportierten AppConfig eingeben.
quelle
Wenn Sie verwenden eckig-cligibt es noch eine andere Option:
Angular CLI bietet Umgebungsdateien in
src/environments
(Standarddateien sindenvironment.ts
(dev) undenvironment.prod.ts
(Produktion)).Beachten Sie, dass Sie die Konfigurationsparameter in allen
environment.*
Dateien angeben müssen , z.Umwelt.ts :
environment.prod.ts :
und verwenden Sie sie in Ihrem Dienst (die richtige Umgebungsdatei wird automatisch ausgewählt):
api.service.ts
Weitere Informationen zu Anwendungsumgebungen auf Github (Angular CLI Version 6) oder im offiziellen Angular-Handbuch (Version 7) .
quelle
Es ist nicht ratsam, die
environment.*.ts
Dateien 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:
/src/assets/
Ordner eine JSON-Konfigurationsdatei hinzu (damit diese beim Erstellen kopiert wird).AppConfigService
, um die Konfiguration zu laden und zu verteilenAPP_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:2. Erstellen
AppConfigService
Dies ist der Dienst, der injiziert wird, wenn Sie den Konfigurationswert benötigen:
3. Laden Sie die Konfiguration mit einem
APP_INITIALIZER
Damit die
AppConfigService
Konfiguration 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,Promise
damit Angular warten kann, bis die Auflösung abgeschlossen ist, bevor der Start abgeschlossen wird:Jetzt können Sie es überall einspritzen, und die gesamte Konfiguration kann gelesen werden:
Ich kann es nicht stark genug sagen. Die Konfiguration Ihrer API-URLs als Konfiguration zur Kompilierungszeit ist ein Anti-Pattern . Verwenden Sie die Laufzeitkonfiguration.
quelle
APP_INITIALIZER
aber ich glaube nicht, dass du sie leicht voneinander abhängig machen kannst. Es hört sich so an, als hätten Sie eine gute Frage zu stellen. Vielleicht können Sie hier darauf verlinken?Hier ist meine Lösung, die von .json geladen wird, um Änderungen ohne Neuerstellung zu ermöglichen
und config.json
quelle
environments.prod.ts
afterng build --prod
wird sich irgendwann in einer.js
Datei befinden. Selbst wenn sie verschleiert sind, werden die Daten vonenvironments.prod.ts
im Klartext angezeigt. Und wie alle .js-Dateien wird es auf dem Endbenutzer-Computer verfügbar sein.Ich habe festgestellt, dass die Verwendung
APP_INITIALIZER
von a dafür nicht in Situationen funktioniert, in denen andere Dienstanbieter die Injektion der Konfiguration benötigen. Sie können instanziiert werden, bevor sieAPP_INITIALIZER
ausgeführt werden.Ich habe andere Lösungen gesehen, die verwendet werden
fetch
, um eine config.json-Datei zu lesen und sie mithilfe eines Injektionstokens in einem Parameter bereitzustellen,platformBrowserDynamic()
bevor das Root-Modul gebootet wird. Aberfetch
in allen Browsern und insbesondere WebView - Browser für die mobilen Geräte nicht unterstützt I Ziel.Das Folgende ist eine Lösung, die für mich sowohl für PWA- als auch für mobile Geräte (WebView) funktioniert. Hinweis: Ich habe bisher nur in Android getestet. Wenn ich von zu Hause aus arbeite, habe ich keinen Zugriff auf einen Mac zum Erstellen.
In
main.ts
:Dieser Code:
config.json
Datei.APP_CONFIG
Injection-Tokens vor dem Bootstrapping.APP_CONFIG
kann dann in weitere Anbieter in injiziert werdenapp-module.ts
und es wird definiert. Zum Beispiel kann ich denFIREBASE_OPTIONS
Injektionstoken wie@angular/fire
folgt initialisieren :Ich finde das Ganze überraschend schwierig (und hackig) für eine sehr häufige Anforderung. Hoffentlich gibt es in naher Zukunft einen besseren Weg, beispielsweise die Unterstützung für asynchrone Anbieterfabriken.
Der Rest des Codes der Vollständigkeit halber ...
In
app/lib/angular/injection-tokens.ts
:und in
app/lib/config/config.ts
definiere ich die Schnittstelle für meine JSON-Konfigurationsdatei:Die Konfiguration ist gespeichert in
assets/config/config.json
:Hinweis: Ich verwende eine Azure DevOps-Aufgabe, um Build.BuildNumber einzufügen und andere Bereitstellungsumgebungen während der Bereitstellung durch andere Einstellungen zu ersetzen.
quelle
Konfigurationsdatei des armen Mannes:
Fügen Sie Ihrer index.html als erste Zeile im Body-Tag hinzu:
Assets hinzufügen / config.js:
Fügen Sie config.ts hinzu:
quelle
Hier sind meine beiden Lösungen dafür
1. In JSON-Dateien speichern
Erstellen Sie einfach eine JSON-Datei und rufen Sie Ihre Komponente nach
$http.get()
Methode auf. Wenn ich das sehr niedrig brauchte, dann ist es gut und schnell.2. Speichern Sie mithilfe von Datendiensten
Wenn Sie in allen Komponenten speichern und verwenden möchten oder eine große Nutzung haben möchten, ist es besser, den Datendienst zu verwenden. So was :
Erstellen Sie einfach einen statischen Ordner innerhalb des
src/app
Ordners.Erstellen Sie eine Datei mit dem Namen as
fuels.ts
in einem statischen Ordner. Sie können hier auch andere statische Dateien speichern. Lassen Sie Ihre Daten so definieren. Angenommen, Sie haben Kraftstoffdaten.__ __
__ __
Importieren Sie einfach die Datei app.module.ts wie folgt und wechseln Sie den Anbieter
Verwenden Sie dies nun wie
StaticService
in jedem Modul.Das ist alles.
quelle
Ich finde diese Angular-Anleitung: Bearbeitbare Konfigurationsdateien aus Microsoft Dev-Blogs die beste Lösung. Sie können Dev Build-Einstellungen oder Prod Build-Einstellungen konfigurieren.
quelle