2017-02-23 31 views
1

我想知道如何在調用安全的URL時重定向到登錄頁面,因爲知道您不能將navController注入服務Ionic 2當我打電話給一個安全的URL時如何重定向到登錄頁

我創造了這樣我的擴展HTTP服務:

@Injectable() 
export class CustomHttp extends Http { 

    constructor (backend: XHRBackend, options: RequestOptions) { 
    let token = localStorage.getItem('auth_token'); 

    options.headers.set('Authorization', `Bearer ${token}`); 
    super(backend, options); 
    } 

    request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> { 
    let token = localStorage.getItem('auth_token'); 
    if (typeof url === 'string') { 
     if (!options) { 
     // let's make option object 
     options = {headers: new Headers()}; 
     } 
     options.headers.set('Authorization', `Bearer ${token}`); 
    } else { 
     url.headers.set('Authorization', `Bearer ${token}`); 
    } 
    return super.request(url, options).catch(this.catchAuthError(this)); 
    } 

    private catchAuthError (self: CustomHttp) { 
    return (res: Response) => { 
    if (res.status === 401 || res.status === 403) { 

    } 

     } 
     return Observable.throw(res); 
    }; 
    } 
} 

謝謝

回答

1

我們可以使用事件,在app.component.ts文件:

import { Events } from 'ionic-angular'; 

那麼一定要聲明一個事件:

public events: Events 

,並從組件中調用一個函數:

listenToEvents() { 
    this.events.subscribe('user:logout',() => { 
     this.nav.setRoot(LoginPage); 
    }); 
    } 

終於在你的服務,你可以發佈事件:

private catchAuthError (self: CustomHttp) { 
    return (res: Response) => { 
    if (res.status === 401 || res.status === 403) { 
     this.events.publish('user:logout'); 
    } 

     } 
     return Observable.throw(res); 
    }; 
    } 
+0

很明顯,OP不希望在任何他稱之爲服務的地方都有代碼導航到登錄頁面。相反,他/她希望他的自定義Http自動導航到登錄頁面,如果沒有登錄。 – n00b

+0

我的意思是成功回調,我沒有指出任何關於錯誤 –

+1

抱歉,我的意思是登錄頁面。你的建議是在每個使用此服務的組件中設置導航根目錄的代碼。這是OP試圖避免的。 OP想要的可能是反對MVC的定義 – n00b

相關問題