编辑:
这对我来说可能是一个更适用的问题,因为它更有用如何查看 Angular2 中 localStorage 的更改?
所以我的主要 app.component 带有导航栏和一个单独的登录页面。我想要的是当他们登录时他们可以看到菜单,否则他们看不到。如果我可以添加对 localStorage 事件的更改,那就太好了。这样,我可以制作一个菜单来动态更改 localStorage 事件。
@Component({
selector: 'my-app',
providers: [FORM_PROVIDERS, RoleService, UserService, Login, LoginService],
inputs: ['loggedIn'],
directives: [ROUTER_DIRECTIVES, CORE_DIRECTIVES, LoggedInRouterOutlet],
template: `<body>
<div *ngIf="loggedIn === true">
<nav class="navbar navbar-inverse navbar-top" role="navigation">
<div class="container">
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right">
<li>
<a (click)="logout()">Logout</a>
</li>
</ul>
</div>
</div>
</nav>
</div>
<div class="container">
<router-outlet></router-outlet>
</div>
</body>`
})
export class AppComponent{
loggedIn: boolean;
constructor(public Login: Login){ /*<--This is a component, can I use it in constructor?*/
Login.loggedIn.subscribe((data) => this.onUserChanged(data));
}
onUserChanged(user){
this.loggedIn = true;
console.log(this.loggedIn);
}
logout(){
localStorage.removeItem('jwt');
}
}
我的登录组件:
@Component
export class Login{
jwt: any;
username: string;
password: string;
loggedIn: EventEmitter<boolean>;
constructor(public _loginService: LoginService, public router: Router){
this.loggedIn = new EventEmitter();
}
submitLogin(username, password){
let body = {username, password};
this._loginService.authenticate(body).subscribe(
response => {
localStorage.setItem('jwt', response.json_token);
this.router.navigate(['UserList']);
this.loggedIn.emit(<boolean>true); /*<---Is this in the wrong place?*/
console.log(this.loggedIn);
}
);
}
}
我的登录服务:
@Injectable()
export class LoginService {
constructor(public http: Http) {
}
authenticate(form_body){
return this.http.post('/login', JSON.stringify(form_body), {headers: headers})
.map((response => response.json()));
}
}
我确定我的事件发射器有问题。我试图复制这篇文章Angular2 中已经回答的内容 - 在多个组件中“监视”提供程序属性,但我似乎无法弄清楚我做错了什么。
如果 localstorage 设置为显示菜单,我想要一些说明。谢谢!