我创建了AuthHttpProvider,它是Http包装器,允许发送GET / POST / PUT / DELETE请求并自动为每个请求添加身份验证令牌(jwt)。我在所有的ionic2应用程序中使用这个包装器而不是Http。现在,当我检测到来自服务器的任何响应有403 Http错误代码时,我想注销用户(并转到loginPage)。
所以当我尝试在构造函数中注入NavController(在403检测后将其用于loginPage)
constructor (public navCtrl: NavController)
我明白了:
Uncaught (in promise): Error: No provider for NavController
如何访问Provider内的navCtrl?
答案 0 :(得分:16)
这是解决方案(来自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;
}
}
但更好的是,如果Provider能够引发一些事件/异常,UI将能够拦截它并将视图更改为loginPage
答案 1 :(得分:1)
您可以像这样轻松地完成操作。
在您的身份验证提供程序中定义一个事件
logoutEvent = new EventEmitter();
然后在注销时发出此事件
this.logoutEvent.next(true)
像这样在app.component.ts中订阅此事件
this.auth.logoutEvent.subscribe(
res => {
this.nav.setRoot(LoginPage);
}
)
希望这对任何人都有用。谢谢