2016-02-14 6 views
14

Stavo cercando di capire come ottenere un menu per apparire e scomparire in base all'accesso in un post precedente. Ma penso che una domanda migliore e probabilmente più semplice sarebbe, come posso osservare le modifiche alla localistage?Come posso vedere le modifiche a localStorage in Angular2?

Sto utilizzando i token web json nella memoria locale per la mia autenticazione, mi piacerebbe vedere una modifica a localStorage e quindi aggiornare la mia vista su nuove informazioni.

ho impostato la mia localStorage con questo

localStorage.setItem('jwt', my_token); 

Le cose che vorrei fare è controllare se ho un motivo, se non lo faccio non succede nulla, ma quando c'è un cambiamento di fuoco di un evento. Mi piacerebbe soprattutto se potessi guardare solo per un certo evento denominato come localStorage.getItem ('jwt').

Grazie!

EDIT:

Gunter mi ha segnalato nella giusta direzione, ma solo nel caso in cui qualcuno è ancora abbastanza confuso da questo, ecco un plunker che vi mostra come fare. http://plnkr.co/edit/TiUasGdutCsll1nI6USC?p=preview

+0

Come hai fatto a convincere quello per funzionare con storage locale? – pwborodich

+2

Fondamentalmente non è possibile guardare ciò che entra nell'archivio locale, ma è possibile creare un osservabile a qualsiasi cosa cambi la memoria locale e guardare per quel cambiamento. Quindi quello che fai è caricare un servizio globale, leggere una volta locale-storage, e poi ogni volta che quella variabile può cambiare via me cambiando il mio webtoken o qualcosa, avvolgo quella variabile con un osservabile e guardo le modifiche a quella variabile , incluso il riaggiornamento della memoria locale e qualsiasi altra cosa voglia fare con questa modifica. –

risposta

1

L'elemento chiave è utilizzare window.addEventListener("storage",. Mentre la libreria probabilmente fa il modo "giusto" per angolare, ecco una versione "leggera" che ho messo insieme, usando .bind(this) invece di masticare circa negli interni di angular.

import { Injectable, OnDestroy } from '@angular/core'; 
import { Observable } from 'rxjs/Observable'; 
import { Subject } from 'rxjs/Subject'; 
import 'rxjs/add/operator/share' 

@Injectable() 
export class StorageService implements OnDestroy { 
    private onSubject = new Subject<{ key: string, value: any }>(); 
    public changes = this.onSubject.asObservable().share(); 

    constructor() { 
    this.start(); 
    } 

    ngOnDestroy() { 
    this.stop(); 
    } 

    public getStorage() { 
    let s = []; 
    for (let i = 0; i < localStorage.length; i++) { 
     s.push({ 
     key: localStorage.key(i), 
     value: JSON.parse(localStorage.getItem(localStorage.key(i))) 
     }); 
    } 
    return s; 
    } 

    public store(key: string, data: any): void { 
    localStorage.setItem(key, JSON.stringify(data)); 
    // the local application doesn't seem to catch changes to localStorage... 
    this.onSubject.next({ key: key, value: data}) 
    } 

    public clear(key) { 
    localStorage.removeItem(key); 
    // the local application doesn't seem to catch changes to localStorage... 
    this.onSubject.next({ key: key, value: null }); 
    } 


    private start(): void { 
    window.addEventListener("storage", this.storageEventListener.bind(this)); 
    } 

    private storageEventListener(event: StorageEvent) { 
    if (event.storageArea == localStorage) { 
     let v; 
     try { v = JSON.parse(event.newValue); } 
     catch (e) { v = event.newValue; } 
     this.onSubject.next({ key: event.key, value: v }); 
    } 
    } 

    private stop(): void { 
    window.removeEventListener("storage", this.storageEventListener.bind(this)); 
    this.onSubject.complete(); 
    } 
} 

LocalStorageTwoTabs

13

Utilizzare un servizio e accedere a LocalStorage tramite questo servizio da qualsiasi luogo.
Il servizio può quindi fornire osservabili che emettono eventi sulle modifiche ed è possibile sottoscrivere questi osservabili per ottenere una notifica.

+1

Grazie per avermi indicato nella giusta direzione! –

+0

Grazie! Ci sono esempi di codice di questo? Ho guardato il Plunker pubblicato da @MorganG, ma sono ancora un po 'confuso. Mi piacerebbe utilizzare localStorage per memorizzare le impostazioni per la mia app che verranno aggiornate in ogni componente pertinente quando vengono cambiate da un componente di impostazioni. – Harry

+0

Puoi provare un pacchetto come https://www.npmjs.com/package/ng2-local-storage (non provato me stesso). Sarebbe più semplice se pubblichi una nuova domanda con il codice che mostri ciò che hai provato e spieghi che cosa causa problemi. Difficile sapere cosa non ti è chiaro. –

1

So che questo post è leggermente vecchio ma ci sono librerie che possono farlo per voi. Ad esempio il h5webstorage ti permetterà di trattare localStorage e sessionStorage come oggetti regolari e la sincronizzazione viene gestita automaticamente. Anche le modifiche allo storage direttamente torneranno nella tua app.

+0

impressionante uomo modulo! Grazie –