【发布时间】:2023-03-18 16:29:01
【问题描述】:
我需要在浏览器的会话中存储数据并检索数据,直到会话退出。您如何在 Angular 2 中使用本地和会话存储?
【问题讨论】:
标签: javascript angular local-storage session-variables
我需要在浏览器的会话中存储数据并检索数据,直到会话退出。您如何在 Angular 2 中使用本地和会话存储?
【问题讨论】:
标签: javascript angular local-storage session-variables
使用Angular2 @LocalStorage模块,描述为:
这个小小的 Angular2/typescript 装饰器让它超级容易保存 并自动恢复指令中的变量状态(类 属性)使用 HTML5 的 LocalStorage。
如果您需要使用 cookie,您应该看看: https://www.npmjs.com/package/angular2-cookie
【讨论】:
ngx-store库兼容angular2-localstorage
标准的localStorage API 应该可用,例如:
localStorage.setItem('whatever', 'something');
请注意,如果您还没有 "lib" 数组,则需要将 "dom" 添加到 tsconfig.json 中。
【讨论】:
如上所说,应该是:localStorageService.set('key', 'value');和localStorageService.get('key');
【讨论】:
如何从 localStorage 存储、检索和删除数据:
// General syntax for storing data
localStorage.setItem('key', 'value');
// Also note that both the key & the value has to be strings.
// So we stringify the value(if it's an object) before setting it.
// So, if you have an object that you want to save, stringify it like this
let data = {
'token': 'token',
'name': 'name'
};
localStorage.setItem('myLSkey', JSON.stringify(data));
// OR for individual key-value pairs
localStorage.setItem('myLSkey', JSON.stringify({
'token': 'token',
'name': 'name'
}));
// To retrieve the data & save it to an existing variable
data = JSON.parse(localStorage.getItem('myLSkey'));
// To remove a value/item from localStorage
localStorage.removeItem("myLSkey");
提示:
您也可以为您的 Angular 应用程序使用包,它基于 本机 localStorage API(我们在上面使用的)来实现这一点 您不必担心字符串化和解析。看看这个 角度 5 及以上的包装。 @ngx-pwa/local-storage
您也可以在 Google 上快速搜索可能,angular local 存储空间,并找到一个拥有更多 Github 星等的包。
查看此page 以了解有关 Web Storage API 的更多信息。
【讨论】:
我们可以很方便地使用localStorage来设置数据和接收数据。
注意:它适用于 angular2 和 angular 4
//set the data
localStorage.setItem(key, value); //syntax example
localStorage.setItem('tokenKey', response.json().token);
//get the data
localStorage.getItem('tokenKey')
//confirm if token is exist or not
return localStorage.getItem('tokenKey') != null;
【讨论】:
本地存储集项目
语法:
localStorage.setItem(key,value);
localStorage.getItem(key);
示例:
localStorage.setItem("name","Muthu");
if(localStorage){ //it checks browser support local storage or not
let Name=localStorage.getItem("name");
if(Name!=null){ // it checks values here or not to the variable
//do some stuff here...
}
}
你也可以使用
localStorage.setItem("name", JSON.stringify("Muthu"));
会话存储设置项
语法:
sessionStorage.setItem(key,value);
sessionStorage.getItem(key);
示例:
sessionStorage.setItem("name","Muthu");
if(sessionStorage){ //it checks browser support session storage/not
let Name=sessionStorage.getItem("name");
if(Name!=null){ // it checks values here or not to the variable
//do some stuff here...
}
}
你也可以使用
sessionStorage.setItem("name", JSON.stringify("Muthu"));
轻松存储和检索数据
【讨论】:
保存到 LocalStorage:
localStorage.setItem('key', value);
对于具有属性的对象:
localStorage.setItem('key', JSON.stringify(object));
从本地存储中获取:
localStorage.getItem('key');
对于对象:
JSON.parse(localStorage.getItem('key'));
localStorage 对象将数据保存为字符串并检索为字符串。您需要解析所需的输出
如果值是存储为字符串的对象。
例如parseInt(localStorage.getItem('key'));
最好使用框架提供的 localStroage 而不是 3rd 方库 localStorageService 或其他任何东西,因为它可以减少您的项目大小。
【讨论】:
安装“angular-2-local-storage”
import { LocalStorageService } from 'angular-2-local-storage';
【讨论】:
您可以使用 cyrilletuzi 的 LocalStorage Asynchronous Angular 2+ Service。
安装:
$ npm install --save @ngx-pwa/local-storage
用法:
// your.service.ts
import { LocalStorage } from '@ngx-pwa/local-storage';
@Injectable()
export class YourService {
constructor(private localStorage: LocalStorage) { }
}
// Syntax
this.localStorage
.setItem('user', { firstName:'Henri', lastName:'Bergson' })
.subscribe( () => {} );
this.localStorage
.getItem<User>('user')
.subscribe( (user) => { alert(user.firstName); /*should be 'Henri'*/ } );
this.localStorage
.removeItem('user')
.subscribe( () => {} );
// Simplified syntax
this.localStorage.setItemSubscribe('user', { firstName:'Henri', lastName:'Bergson' });
this.localStorage.removeItemSubscribe('user');
更多信息在这里:
https://www.npmjs.com/package/@ngx-pwa/local-storage
https://github.com/cyrilletuzi/angular-async-local-storage
【讨论】:
这是一个简单服务的示例,它使用 localStorage 来持久化数据:
import { Injectable } from '@angular/core';
@Injectable()
export class PersistanceService {
constructor() {}
set(key: string, data: any): void {
try {
localStorage.setItem(key, JSON.stringify(data));
} catch (e) {
console.error('Error saving to localStorage', e);
}
}
get(key: string) {
try {
return JSON.parse(localStorage.getItem(key));
} catch (e) {
console.error('Error getting data from localStorage', e);
return null;
}
}
}
要使用此服务,请像往常一样在应用程序的某个模块中提供它,例如在核心模块中。然后像这样使用:
import { Injectable } from '@angular/core';
@Injectable()
export class SomeOtherService {
constructor(private persister: PersistanceService) {}
someMethod() {
const myData = {foo: 'bar'};
persister.set('SOME_KEY', myData);
}
someOtherMethod() {
const myData = persister.get('SOME_KEY');
}
}
【讨论】:
您也可以考虑使用我维护的库:ngx-store (npm i ngx-store)
它使使用 localStorage、sessionStorage 和 cookie 变得异常容易。有一些支持的方法来操作数据:
1) 装饰者:
export class SomeComponent {
@LocalStorage() items: Array<string> = [];
addItem(item: string) {
this.items.push(item);
console.log('current items:', this.items);
// and that's all: parsing and saving is made by the lib in the background
}
}
装饰器存储的变量也可以在不同的类之间共享 - 还有为它设计的 @TempStorage()(别名为 @SharedStorage()))装饰器。
2) 简单的服务方式:
export class SomeComponent {
constructor(localStorageService: LocalStorageService) {}
public saveSettings(settings: SettingsInterface) {
this.localStorageService.set('settings', settings);
}
public clearStorage() {
this.localStorageService.utility
.forEach((value, key) => console.log('clearing ', key));
this.localStorageService.clear();
}
}
3) 建造者模式:
interface ModuleSettings {
viewType?: string;
notificationsCount: number;
displayName: string;
}
class ModuleService {
constructor(public localStorageService: LocalStorageService) {}
public get settings(): NgxResource<ModuleSettings> {
return this.localStorageService
.load(`userSettings`)
.setPath(`modules`)
.setDefaultValue({}) // we have to set {} as default value, because numeric `moduleId` would create an array
.appendPath(this.moduleId)
.setDefaultValue({});
}
public saveModuleSettings(settings: ModuleSettings) {
this.settings.save(settings);
}
public updateModuleSettings(settings: Partial<ModuleSettings>) {
this.settings.update(settings);
}
}
另一个重要的事情是你可以监听(每一个)存储变化,例如(以下代码使用 RxJS v5 语法):
this.localStorageService.observe()
.filter(event => !event.isInternal)
.subscribe((event) => {
// events here are equal like would be in:
// window.addEventListener('storage', (event) => {});
// excluding sessionStorage events
// and event.type will be set to 'localStorage' (instead of 'storage')
});
WebStorageService.observe() 返回一个常规的 Observable,因此您可以压缩、过滤、反弹它们等。
我总是乐于听取帮助我改进这个库及其文档的建议和问题。
【讨论】:
decorators 与 services 方法有什么区别?
真正优雅的解决方案是装饰器。您可以使用它们来标记要存储的变量。
export class SomeComponent {
@LocalStorage
public variableToBeStored: string;
}
【讨论】:
在本地存储中设置项目或对象:
localStorage.setItem('yourKey', 'yourValue');
要在本地存储中获取项目或对象,您必须记住您的密钥。
let yourVariable = localStorage.getItem('yourKey');
要将其从本地存储中删除:
localStorage.removeItem('yourKey');
【讨论】:
设置项的语法是
localStorage.setItem(key,value);
get item的语法是
localStorage.getItem(key);
一个例子是:
localStorage.setItem('email','abc@gmail.com');
let mail = localStorage.getItem("email");
if(mail){
console.log('your email id is', mail);
}
}
【讨论】:
安装
npm install --save @ngx-pwa/local-storage
首先你需要安装“angular-2-local-storage”
import { LocalStorageService } from 'angular-2-local-storage';
保存到本地存储:
localStorage.setItem('key', value);
从本地存储中获取:
localStorage.getItem('key');
【讨论】:
存储在LocalStorage:
window.localStorage.setItem(key, data);
从LocalStorage 中删除项目:
window.localStorage.removeItem(key);
从LocalStorage 获取物品:
window.localStorage.getItem(key);
LocalStorage中只能存储一个字符串;如果你有一个对象,首先你必须将它转换为字符串,如下所示:
window.localStorage.setItem(key, JSON.stringify(obj));
当你想从LocalStorage 获取对象时:
const result=JSON.parse(window.localStorage.getItem(key));
以上所有提示与SessionStorage 相同。
您可以使用以下服务来处理SessionStorage 和LocalStorage。服务中的所有方法:
getSession(key: string): any
setSession(key: string, value: any): void
removeSession(key: string): void
removeAllSessions(): void
getLocal(key: string): any
setLocal(key: string, value: any): void
removeLocal(key: string): void
removeAllLocals(): void
在您的组件、服务和...中注入此服务;不要忘记在核心模块中注册服务。
import { Injectable } from '@angular/core';
@Injectable()
export class BrowserStorageService {
getSession(key: string): any {
const data = window.sessionStorage.getItem(key);
if (data) {
return JSON.parse(data);
} else {
return null;
}
}
setSession(key: string, value: any): void {
const data = value === undefined ? '' : JSON.stringify(value);
window.sessionStorage.setItem(key, data);
}
removeSession(key: string): void {
window.sessionStorage.removeItem(key);
}
removeAllSessions(): void {
for (const key in window.sessionStorage) {
if (window.sessionStorage.hasOwnProperty(key)) {
this.removeSession(key);
}
}
}
getLocal(key: string): any {
const data = window.localStorage.getItem(key);
if (data) {
return JSON.parse(data);
} else {
return null;
}
}
setLocal(key: string, value: any): void {
const data = value === undefined ? '' : JSON.stringify(value);
window.localStorage.setItem(key, data);
}
removeLocal(key: string): void {
window.localStorage.removeItem(key);
}
removeAllLocals(): void {
for (const key in window.localStorage) {
if (window.localStorage.hasOwnProperty(key)) {
this.removeLocal(key);
}
}
}
}
【讨论】: