Ich versuche gerade, eine benutzerdefinierte XHRBackend
für meine angular2 App zu erstellen. Ich möchte alle HTTP-Antworten mit einem HTTP-Antwortcode 401 (nicht autorisiert) abfangen, um den Benutzer auf der Anmeldeseite umzuleiten. Aber hier kommt mein Problem: der DI ist nicht in der Lage, die Router
in meinem Custom-Backend zu laden.Dependency Injection lädt nicht alle Parameter
@Injectable()
export class CustomXHRBackend extends XHRBackend {
constructor(
_browserXHR: BrowserXhr,
_baseResponseOptions: ResponseOptions,
_xsrfStrategy: XSRFStrategy,
private router : Router) {
super(_browserXHR, _baseResponseOptions, _xsrfStrategy);
console.log(router); // --> undefined
}
createConnection(request: Request) {
let xhrConnection = super.createConnection(request);
xhrConnection.response = xhrConnection.response.catch((error, caugth) => {
if(error.status === 401) {
//Do stuff with the new router
this.router.navigate(['/login']);
}
return Observable.throw(caugth);
});
return xhrConnection;
}
}
Es scheint, wie immer noch die DI die Metadaten des XHRBackend
verwendet, weil die ersten 3 params definiert sind.
habe ich eine plunkr, das dieses Problem veranschaulicht: http://plnkr.co/edit/44imf9KpE06cIyQ395sg?p=preview
Hinweis:
Die plunkr basiert auf dem angular2 Router Beispiel, leider hatte ich nicht genug Zeit, um einen kleineren zu schaffen ein. Die wichtigen Dateien sind custom.backend.ts
und vielleicht main.ts
.
Hat jemand eine Idee, warum das passiert?
Aber dann müsste ich das mit jeder 'HTTP-Methode' machen. Denkst du nicht, es wäre besser, es nur einmal zu tun? Wir werden nur das XHRBackend verwenden. – Dinistro
Und das behebt das Problem nicht, dass ich nicht in der Lage bin, etwas anderes als die 3 Parameter in ein benutzerdefiniertes Backend zu injizieren. – Dinistro
Für die Injektion Problem, ich denke, Sie müssen explizite Parameter mit 'UseFactory' bereitstellen. Ich habe meine Antwort aktualisiert. –