通常我會提供一個HttpService
我自己,而不是直接使用Http
。因此,根據您的要求,我可以在發送任何實際的HTTP請求之前提供自己的get()
方法來鏈接身份驗證。
這裏是服務:
@Injectable()
class HttpService {
constructor(private http: Http, private auth: Authentication) {}
public get(url: string): Observable<Response> {
return this.auth.authenticate().flatMap(authenticated => {
if (authenticated) {
return this.http.get(url);
}
else {
return Observable.throw('Unable to re-authenticate');
}
});
}
}
這裏是調用該服務的組件:
@Component({
selector: 'my-app',
template: `<h1>Hello {{name}}</h1>
<button (click)="doSomething()">Do Something</button>
<div [hidden]="!auth.showModal">
<p>Do you confirm to log in?</p>
<button (click)="yes()">Yes</button><button (click)="no()">No</button>
</div>
`,
})
export class AppComponent {
name = 'Angular';
constructor(private httpSvc: HttpService, public auth: Authentication) {}
ngOnInit() {
}
doSomething() {
let a = this.httpSvc.get('hello.json').subscribe(() => {
alert('Data retrieved!');
}, err => {
alert(err);
});
}
yes() {
this.auth.confirm.emit(true);
}
no() {
this.auth.confirm.emit(false);
}
}
通過鏈接可觀測量,所述Authentication
服務確定是否中斷的正常流動,以顯示模式(儘管目前只與App組件共存,但它當然可以單獨實現)。一旦從對話中收到了肯定的答案,服務就可以恢復流程。
class Authentication {
public needsAuthentication = true;
public showModal = false;
public confirm = new EventEmitter<boolean>();
public authenticate(): Observable<boolean> {
// do something to make sure authentication token works correctly
if (this.needsAuthentication) {
this.showModal = true;
return Observable.create(observer => {
this.confirm.subscribe(r => {
this.showModal = false;
this.needsAuthentication = !r;
observer.next(r);
observer.complete();
});
});
}
else {
return Observable.of(true);
}
}
}
我在這裏有一個完整的現場示例。
http://plnkr.co/edit/C129guNJvri5hbGZGsHp?open=app%2Fapp.component.ts&p=preview
關於與終極版處理應用程序的狀態是什麼? –
如果您綁定到共享服務的數據,那麼在重新導航後它不會丟失。類似於Redux的建議。 –
即使頁面重新加載,是否需要保存? – Maxime