【发布时间】:2018-02-16 21:21:45
【问题描述】:
我正在学习如何使用适用于 Angular 2 的 Visual Studio 2017 SPA 模板。
对于这个练习,我希望我的 HomeComponent 在登录我的 AppLoginComponent 后显示存储在本地存储 (NgxLocalStorage) 中的登录用户的名称。 https://www.npmjs.com/package/ngx-localstorage
我已经研究过这个问题,我相信我走在正确的轨道上,但由于某种原因,我的 HomeComponent 在 localStorage 中看不到键/值对。但是,在 login() 中设置后,我可以在 Chrome 的开发者工具中看到它。
NgxLocalStorage 有一个名为 get 的方法,而不是 getItem,但它的工作方式似乎与 getItem 相同。不幸的是,它没有恢复我的价值。
我对 Angular 2 很陌生,我确定我只是在某个地方遗漏了一些东西,请帮忙。
我已经将 NgxLocalStorageModule 导入到 app.module.shared 中的 NgModule 中:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { RouterModule } from '@angular/router';
import { NgxLocalStorageModule } from 'ngx-localstorage';
import { AppComponent } from './components/app/app.component';
import { NavMenuComponent } from './components/navmenu/navmenu.component';
import { HomeComponent } from './components/home/home.component';
import { AppLoginComponent } from './components/applogin/applogin.component';
import { FacebookService, FacebookModule } from 'ngx-facebook/dist/esm/index';
@NgModule({
declarations: [
AppComponent,
NavMenuComponent,
HomeComponent,
AppLoginComponent
],
imports: [
CommonModule,
HttpModule,
FormsModule,
RouterModule.forRoot([
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{ path: 'home', component: HomeComponent },
{ path: 'applogin', component: AppLoginComponent },
{ path: '**', redirectTo: 'home' }
]),
FacebookModule.forRoot(),
NgxLocalStorageModule.forRoot()
],
providers: [FacebookService, NgxLocalStorageModule]
})
export class AppModuleShared {
}
在我的 HomeComponent 中,我有:
import { Component } from '@angular/core';
import { LocalStorageService } from 'ngx-localstorage';
@Component({
selector: 'home',
templateUrl: './home.component.html'
})
export class HomeComponent {
currentUser: string;
constructor(private localStorage: LocalStorageService) {
this.currentUser = JSON.parse(localStorage.get('currentUser') || '');
}
}
在 AppLoginComponent 我有:
import { Component, NgZone } from '@angular/core';
import { FacebookService, InitParams, LoginResponse } from 'ngx-facebook/dist/esm/index';
import { LocalStorageService } from 'ngx-localstorage';
@Component({
selector: 'applogin',
templateUrl: './applogin.component.html'
})
export class AppLoginComponent {
public loggedIn = false;
name = "";
constructor(private _ngZone: NgZone, private fb: FacebookService, localStorage: LocalStorageService) {
let initParams: InitParams = {
appId: '123456789',
xfbml: true,
version: 'v2.8'
};
fb.init(initParams);
}
login() {
var self = this;
this.fb.login()
.then((res: LoginResponse) => {
if (res.authResponse) {
this.fb.api('/me')
.then((res: any) => {
self._ngZone.run(() => {
self.name = res.name;
self.loggedIn = true;
localStorage.setItem('currentUser', res.name);
});
});
} else {
alert('Not authorized.');
}
})
.catch();
}
【问题讨论】:
-
您是否尝试过在一种方法中调用 setItem() 和 get(),确保 localStorage 有效吗?也许这两个组件获得的服务实例不同。
-
这行得通,现在我如何在整个应用程序中访问相同的存储空间,例如我的 HomeComponent?
-
在
app.module.ts中,您注册了NgxLocalStorageModule提供程序。这应该使服务成为单例。将localStorage构造函数参数保存在组件的成员变量中,并使用this.localStorage访问。 -
@zgue 只是需要更多信息,请更详细一点,哪个构造函数? HomeComponent 构造函数?
-
使
localStorage也成为AppLoginComponent的成员,并使用this.localStorage访问它。这样它必须是注入的服务。
标签: visual-studio angular local-storage visual-studio-2017