update2
Plunker Beispiel
AoT aktualisieren
Um mit AoT arbeiten zu können, muss die Werksschließung ausgezogen werden
function loadContext(context: ContextService) {
return () => context.load();
}
@NgModule({
...
providers: [ ..., ContextService, { provide: APP_INITIALIZER, useFactory: loadContext, deps: [ContextService], multi: true } ],
Siehe auch https://github.com/angular/angular/issues/11262
Aktualisieren Sie ein letztes Beispiel für RC.6 und 2.0.0
function configServiceFactory (config: ConfigService) {
return () => config.load();
}
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule,
routes,
FormsModule,
HttpModule],
providers: [AuthService,
Title,
appRoutingProviders,
ConfigService,
{ provide: APP_INITIALIZER,
useFactory: configServiceFactory
deps: [ConfigService],
multi: true }
],
bootstrap: [AppComponent]
})
export class AppModule { }
Wenn Sie nicht warten müssen, bis die Initialisierung abgeschlossen ist, kann auch der Konstruktor der Klasse AppModule {} verwendet werden:
class AppModule {
constructor() {...}
}
Hinweis (zyklische Abhängigkeit)
Beispielsweise kann das Injizieren des Routers zyklische Abhängigkeiten verursachen. Um dies zu umgehen, injizieren Sie die Injectorund erhalten Sie die Abhängigkeit von
this.myDep = injector.get(MyDependency);
anstatt MyDependencydirekt zu injizieren wie:
@Injectable()
export class ConfigService {
private router:Router;
constructor( injector:Injector) {
setTimeout(() => this.router = injector.get(Router));
}
}
aktualisieren
Dies sollte in RC.5 genauso funktionieren, aber stattdessen den Provider providers: [...]des Root-Moduls hinzufügenbootstrap(...)
(habe mich noch nicht getestet).
aktualisieren
Ein interessanter Ansatz, um dies vollständig in Angular zu tun, wird hier erklärt: https://github.com/angular/angular/issues/9047#issuecomment-224075188
Sie können verwenden, APP_INITIALIZERwelche Funktion ausgeführt wird, wenn die App initialisiert wird, und die Bereitstellung verzögern, wenn die Funktion ein Versprechen zurückgibt. Dies bedeutet, dass die App ohne große Latenz initialisiert werden kann und Sie auch die vorhandenen Dienste und Framework-Funktionen verwenden können.
Angenommen, Sie haben eine Lösung mit mehreren Mandanten, bei der die Site-Informationen vom Domain-Namen abhängen, von dem aus sie bereitgestellt werden. Dies kann [Name] .letterpress.com oder eine benutzerdefinierte Domain sein, die mit dem vollständigen Hostnamen übereinstimmt. Wir können die Tatsache verbergen, dass dies hinter einem Versprechen steht, indem wir verwenden APP_INITIALIZER.
Im Bootstrap:
{provide: APP_INITIALIZER, useFactory: (sites:SitesService) => () => sites.load(), deps:[SitesService, HTTP_PROVIDERS], multi: true}),
sites.service.ts:
@Injectable()
export class SitesService {
public current:Site;
constructor(private http:Http, private config:Config) { }
load():Promise<Site> {
var url:string;
var pos = location.hostname.lastIndexOf(this.config.rootDomain);
var url = (pos === -1)
? this.config.apiEndpoint + '/sites?host=' + location.hostname
: this.config.apiEndpoint + '/sites/' + location.hostname.substr(0, pos);
var promise = this.http.get(url).map(res => res.json()).toPromise();
promise.then(site => this.current = site);
return promise;
}
HINWEIS: configist nur eine benutzerdefinierte Konfigurationsklasse. rootDomainwäre
'.letterpress.com'für dieses Beispiel und würde Dinge wie erlauben
aptaincodeman.letterpress.com.
Alle Komponenten und anderen Dienste können jetzt Sitein sie eingefügt werden und die .currentEigenschaft verwenden, bei der es sich um ein konkretes Objekt handelt, ohne dass auf ein Versprechen in der App gewartet werden muss.
Dieser Ansatz schien die Startlatenz zu verringern, was ansonsten ziemlich auffiel, wenn Sie darauf warteten, dass das große Angular-Bundle geladen wurde, und dann eine weitere http-Anforderung, bevor der Bootstrap überhaupt begann.
Original
Sie können es mit Angulars-Abhängigkeitsinjektion übergeben:
var headers = ...
bootstrap(AppComponent, [{provide: 'headers', useValue: headers})]);
class SomeComponentOrService {
constructor(@Inject('headers') private headers) {}
}
oder BaseRequestOptionsdirekt wie vorbereitet bereitstellen
class MyRequestOptions extends BaseRequestOptions {
constructor (private headers) {
super();
}
}
var values = ...
var headers = new MyRequestOptions(values);
bootstrap(AppComponent, [{provide: BaseRequestOptions, useValue: headers})]);
<script> function() { window.headers = someJson; }()</script>. Ich bin mir nicht sicher über die Syntax, ich benutze JS selbst nicht viel. Auf diese Weise müssten Sie überhaupt nicht analysieren.