您好我正在使用angularjs2 https://angular.io/docs/ts/latest/guide/router.html
的新alpha组件路由器我有一个模式用于验证用户,然后在localstorage中创建一个JWT,用于保存用户所需的信息。
我的问题是,如果用户正在查看/home
路径,那里只有登录用户可见的东西,但在他通过模态登录后,他必须刷新页面以便组件将刷新并显示正确的登录信息
有没有办法让angular2刷新当前路径上的所有组件?像一个页面重新加载,但没有真正重新加载整个页面(我不想只是为用户点击刷新按钮)
提前致谢
编辑:当我尝试重定向到我已经在的路线时,可能还有一项强制转换的功能吗?
EDIT2:尝试使用observables
@Injectable()
export class UserService {
private loggedInObservable;
constructor(private http: Http) {
this.loggedInObservable = Observable.of(this.checkIsLoggedIn());
}
checkIsLoggedIn() {
let isLoggedIn = false;
try {
isLoggedIn = tokenNotExpired();
} catch(e) {
}
console.log('returning:', isLoggedIn);
return isLoggedIn;
}
login(model, cbSuccess=null, cbError=null, cbAlways=null) {
serverPost(this, '/api/users/login', model, cbSuccess, cbError, cbAlways, (data)=> {
localStorage.setItem("id_token", data.id_token);
this.loggedInObservable.map((val) => console.log('HELLO?'));
});
}
isLoggedInObservable() {
return this.loggedInObservable;
}
}
地图根本没有显示('HELLO?'没有显示),虽然观察者有一个值,但map函数不会调用任何东西。
使用观察者:
import {Component, OnInit, OnDestroy} from '@angular/core';
import {UserService} from '../../services/userservice';
@Component({
selector: 'test-thing',
template: require('./test-thing.html'),
styles: [require('./test-thing.scss')],
providers: [],
directives: [],
pipes: []
})
export class TestThing implements OnInit, OnDestroy{
private isLoggedIn = false;
private sub: any;
constructor(private userService: UserService) {
};
ngOnInit() {
this.sub = this.userService.isLoggedInObservable().subscribe(loggedIn => {
this.isLoggedIn = loggedIn;
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
}
初始值按预期工作但是当我尝试在成功登录后更改值(使用地图)时没有任何反应,没有任何反应。
答案 0 :(得分:5)
好吧我似乎需要的是一个 BehaviorSubject ,因为你可以将值推入其中,订阅它以获得更改,并预测它在你第一次订阅时获得的最后一个值,这是正是我需要的。
我的代码现在如下:
userservice.ts
import {Injectable} from '@angular/core';
import {Http} from '@angular/http';
import {serverPost} from '../../functions';
import {BehaviorSubject} from 'rxjs/BehaviorSubject'
import {tokenNotExpired} from 'angular2-jwt';
@Injectable()
export class UserService {
private isLoggedInSubject: BehaviorSubject<boolean>;
constructor(private http: Http) {
this.isLoggedInSubject = new BehaviorSubject(this.checkIsLoggedIn());
}
get loggedInObservable() {
return this.isLoggedInSubject.asObservable();
}
checkIsLoggedIn() {
let isLoggedIn = false;
try {
isLoggedIn = tokenNotExpired();
} catch(e) {
}
return isLoggedIn;
}
signUp(model, cbSuccess=null, cbError=null, cbAlways=null) {
serverPost(this, '/api/users', model, cbSuccess, cbError, cbAlways, (data)=> {
localStorage.setItem("id_token", data.id_token);
this.isLoggedInSubject.next(this.checkIsLoggedIn());
});
}
login(model, cbSuccess=null, cbError=null, cbAlways=null) {
serverPost(this, '/api/users/login', model, cbSuccess, cbError, cbAlways, (data)=> {
localStorage.setItem("id_token", data.id_token);
this.isLoggedInSubject.next(this.checkIsLoggedIn());
});
}
}
这就是我在组件中使用它的方式:
export class TestComponent implements OnInit, OnDestroy{
private isLoggedIn = false;
private loginSub;
constructor(private userService: UserService) {
};
ngOnInit() {
this.loginSub = this.userService.loggedInObservable.subscribe(val => {
this.isLoggedIn = val;
});
}
ngOnDestroy() {
this.loginSub.unsubscribe();
}
}
此设置完全符合我的需求。