2016-02-14 5 views
14

Ich habe versucht herauszufinden, wie man ein Menü erscheinen und verschwinden lässt, wenn man in einem früheren Post angemeldet ist. Aber ich denke, eine bessere und möglicherweise einfachere Frage wäre, wie kann ich auf Veränderungen im lokalen Speicher achten?Wie kann ich Änderungen in LocalStorage in Angular2 überwachen?

Ich benutze Json Web-Token im lokalen Speicher für meine Authentifizierung, würde ich gerne auf eine Änderung der localStorage zu sehen und dann meine Sicht auf neue Informationen neu zu aktualisieren.

ich meine local mit diesem

localStorage.setItem('jwt', my_token); 

Die Dinge, die ich wird überprüfen tun möchte, wenn ich ein Token haben, passiert, wenn ich nicht nichts tun, aber wenn es eine Änderung Feuer ein Ereignis. Ich würde es besonders mögen, wenn ich nur nach einem bestimmten benannten Ereignis wie localStorage.getItem ('jwt') schauen könnte.

Danke!

EDIT:

Gunter mich in die richtige Richtung, aber nur für den Fall ist jemand noch ziemlich durch das verwirrt, hier ist ein Plunker zeigt Ihnen, wie es geht. http://plnkr.co/edit/TiUasGdutCsll1nI6USC?p=preview

+0

Wie hast du das mit lokalem Speicher zu arbeiten? – pwborodich

+2

Grundsätzlich können Sie nicht beobachten, was in den lokalen Speicher eindringt, aber Sie können eine Observable für alle Änderungen des lokalen Speichers erstellen und auf diese Änderung achten. Also, was Sie tun, ist ein globaler Dienst laden, haben es lokalen Speicher einmal gelesen, und dann, wann immer diese Variable über mich ändern kann mein Webtoken oder etwas, ich wickle diese Variable mit einem Observable und achten Sie auf Änderungen an dieser Variablen einschließlich der Aktualisierung des lokalen Speichers und was ich sonst mit dieser Änderung machen möchte. –

Antwort

1

Der Schlüssel ist, window.addEventListener("storage", zu verwenden. Während die Bibliothek es wahrscheinlich den "richtigen" Weg für eckig macht, ist hier eine "leichte" Version, die ich zusammensetze, indem ich .bind(this) anstelle von in eckigen Interna mucking.

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

Verwenden Sie einen Dienst und greifen Sie über diesen Dienst nur von überall auf LocalStorage zu.
Der Dienst kann dann Observables bereitstellen, die Ereignisse bei Änderungen ausgeben, und Sie können diese Observables abonnieren, um benachrichtigt zu werden.

+1

Danke, dass Sie mich in die richtige Richtung weisen! –

+0

Danke! Gibt es dafür Codebeispiele? Ich schaute auf den Plunker von @MorganG, bin aber immer noch ein wenig verwirrt. Ich möchte localStorage verwenden, um Einstellungen für meine App zu speichern, die in jeder relevanten Komponente aktualisiert werden, wenn sie aus einer Einstellungs-Komponente geändert werden. – Harry

+0

Sie können ein Paket wie https://www.npmjs.com/package/ng2-local-storage versuchen (nicht ausprobiert). Es wäre einfacher, wenn Sie eine neue Frage mit dem Code, der zeigt, was Sie versucht haben, und erklären, was Ihnen Probleme verursacht. Schwer zu wissen, was dir unklar ist. –

1

Ich weiß, dass dieser Beitrag etwas alt ist, aber es gibt Bibliotheken, die das für Sie tun können. Zum Beispiel die h5webstorage können Sie behandeln LocalStorage und SessionStorage wie reguläre Objekte und Synchronisation wird automatisch behandelt. Auch Änderungen am Speicher werden direkt in Ihre App zurückgeleitet.

+0

super modul mann! Vielen Dank –

Verwandte Themen