2017-06-13 56 views
4

我創建了AuthHttpProvider,它是Http包裝器,允許發送GET/POST/PUT/DELETE請求並自動爲每個請求添加身份驗證令牌(jwt)。我在我所有的ionic2應用程序中使用這個包裝器代替Http。現在,當我檢測到來自服務器的任何響應具有403 Http錯誤代碼時,我想要註銷用戶(並轉到loginPage)。Ionic2如何在提供商中獲得NavController

所以,當我嘗試注入NavController在構造函數通過

constructor (public navCtrl: NavController) 

(它經過403檢測使用loginPage)我得到:

Uncaught (in promise): Error: No provider for NavController 

怎麼到navCtrl內提供訪問?

回答

10

這裏是解決方案(從this):

import { Injectable, Injector } from '@angular/core'; 
import { Http, Headers } from '@angular/http'; 
import { Observable } from "rxjs"; 
import 'rxjs/add/operator/map'; 
import { App } from "ionic-angular"; 
import { NavController } from "ionic-angular/index"; 
import { LoginPage } from "../../pages/login/login"; 
... 

@Injectable() 
export class AuthHttpProvider { 

    private navCtrl: NavController; 
    ... 

    constructor(public http: Http, ..., private app:App) { 
    this.navCtrl = app.getActiveNav(); 
    } 

    get(url) { // http GET 
    return this.http.get(url, this.getHeaders()) 
        .catch(this.globalErr(this)); 
    } 

    // ... http POST/PUT/DELETE 

    private getHeaders() { ... } //(cors, csrf-token ...) 

    private globalErr(self) { 
    return (err) => { 
     if (err.status == 403) { self.logout(); } 
     return Observable.throw(err); 
    }; 
    } 

    public logout() { 
    // ... 
    this.navCtrl.setRoot(LoginPage); 
    this.navCtrl.popToRoot; 
    } 
} 

但是更好的將是,如果供應商能夠提出一些事件/異常和UI將能夠攔截並改變以loginPage

+0

如果有些人想知道getHeaders方法在這裏看起來是一些代碼(由於發送和在CORS中設置cookie,我使用withCredentials): headers.append('csrf-token',csrfToken); headers.append('Accept','application/json'); headers.append('Content-Type','application/json'); return {headers:headers,withCredentials:true}; ' –