gpt4 book ai didi

javascript - 为什么我的共享服务未在我的组件之间更新?

转载 作者:行者123 更新时间:2023-12-03 07:29:33 25 4
gpt4 key购买 nike

在我的 Angular2 应用程序中,我正在引导一个身份验证服务 LocalStorage,我希望在我的组件之间共享该服务:

bootstrap(AppComponent, [
ROUTER_PROVIDERS,
LocalStorage
]);

LocalStorage 定义如下:

import {JwtHelper} from 'angular2-jwt/angular2-jwt';
import { Injectable } from 'angular2/core';

@Injectable()
export class LocalStorage {

key:string = 'jwt';
jwtHelper:JwtHelper = new JwtHelper();
username:string;

constructor() {

let token = localStorage.getItem(this.key);

if (token == null) return;

if (this.jwtHelper.isTokenExpired(token)) {
localStorage.removeItem(this.key);
} else {
this.username = this.jwtHelper.decodeToken(token).username;
}
}

login(jwt:string) {
localStorage.setItem(this.key, jwt);
}

logout() {
localStorage.removeItem(this.key);
}

isLoggedIn():boolean {
return this.username != null;
}

getUsername():string {
return this.username;
}

getToken():string {
return localStorage.getItem(this.key);
}
}

但是,问题是,当我跨组件共享和更新它时,只有更新它的组件才能识别更改。它被注入(inject)到组件中并像这样编辑:

    constructor(private router:Router, private localStorage:LocalStorage) {

...
}

logout(event) {
event.preventDefault();
this.localStorage.logout();
this.router.navigateByUrl(RoutingPaths.home.path);
}

为什么似乎跨组件创建了该服务的多个实例?谢谢。

编辑组件模板绑定(bind)的示例是:

组件:

import {Component} from 'angular2/core';
import {Router, RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router';
import {RoutingPaths} from './routing-paths';
import {LoggedInOutlet} from './logged-in-outlet';
import {LocalStorage} from './local-storage'

@Component({
selector: 'my-app',
templateUrl: 'app/app.template.html',
directives: [LoggedInOutlet, ROUTER_DIRECTIVES]
})
export class AppComponent {

registerName:string;

constructor(private router:Router, private localStorage:LocalStorage) {
this.registerName = RoutingPaths.register.name;
}

logout(event) {
event.preventDefault();
this.localStorage.logout();
this.router.navigateByUrl(RoutingPaths.home.path);
}
}

模板:

<a *ngIf="!localStorage.isLoggedIn()" [routerLink]="[registerName]">Register</a>

最终编辑

这很尴尬,在服务中实际编辑用户名后,它现在可以工作了:

    login(jwt:string) {
localStorage.setItem(this.key, jwt);
this.username = this.jwtHelper.decodeToken(jwt).username; // here
}

logout() {
localStorage.removeItem(this.key);
this.username = null; // here
}

抱歉浪费了大家的时间。再次感谢。

最佳答案

这是因为您在代码中的某个位置将 LocalStorage 指定为提供程序。

检查您的任何组件是否包含:

@Component({
providers: [LocalStorage]
})

这会向注入(inject)器发出指令,为该组件和所有子组件创建一个新实例(如果子组件本身没有提供 LocalStorage)。

关于javascript - 为什么我的共享服务未在我的组件之间更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35855814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com