2017-10-20 4 views
0

Ich habe zwei Seiten: my-view1 und my-view2. Auf my-view1 habe ich zwei Schaltflächen, die Daten aus LocalStorage hinzufügen und entfernen. Auf my-view2 habe ich zwei einfache Divs, die den Gesamtwert LESEN (anzeigen) und den Gesamtwert in den letzten 6 Monaten anzeigen.Polymer - JavaScript - Datenbindung: Echtzeit-Update?

Auf der zweiten Seite wird der Wert jedoch nicht aktualisiert, wenn die Seite nicht aktualisiert wird. Ich möchte, dass die Werte von my-view2 automatisch aktualisiert werden, wenn die Seite geladen wird (angezeigt, auch wenn zwischengespeichert).

Hier ist ein PLNKR mit My-View2, so dass Sie understrand können, was ich versuche zu tun.

https://plnkr.co/edit/ul4T2mduxjElCN4rUUKd?p=info

Wie kann ich das tun?

+0

spielen Sie die WebSockets verwenden können, dass Ihre Seite zu aktualisieren (view-2) dynamisch, wann immer der Wert geändert wird, oder Sie haben keine Backend Sie die Eventstream verwenden können dieser Zweck. Und für das aktuelle Szenario können Sie einfach settinterval verwenden, um jede Sekunde zu überprüfen, die Sie lokal speichern, wenn es Änderungen gibt, die die Änderung in Ihrer Seite widerspiegeln. –

+0

Vielen Dank für Ihre Antwort! Ich baue gerade diese Seiten als PWA. Funktionieren Websockets auch offline? Wenn Sie setInterval verwenden, lässt die App auch schlafen? oder es wird kontinuierlich laufen? – unkn0wnx

+0

setInterval funktioniert im Offline-Modus und Ja, Sie können eine Logik einrichten, um zu erkennen, ob die App im Sleep-Modus ist, können Sie die Intervallprüfung abbrechen und wenn Sie aus dem Sleep-Modus erwachen, können Sie fortfahren. Aber für WebSockets benötigen Sie eine aktive Internetverbindung und wenn Sie an myview-1 und myview-2 nebeneinander arbeiten, können Sie Post-Nachrichten verwenden, um zu kommunizieren und das my-view-2 zu aktualisieren. –

Antwort

0

können Sie hören auf die storage Ereignis auszulösen und einige Stütze in my-view2 zu aktualisieren, wenn Sie local aktualisieren:

<my-view-2 id="myView2"></my-view-2> 
<script> 
    window.onstorage = function(e) { 
    if (e.key !== 'someKeyYouWant') return; 
    document.getElementById('myView2').set('someProp', { 
     oldValue: e.oldValue, 
     newValue: e.newValue 
    }); 
    }; 
</script> 

EDIT (working plunk): Aufgrund eines Verhaltens here das Speicher Ereignis beschrieben wird nicht Ursprung der Änderung auf dem Fenster ausgelöst, so dass Sie Ihre eigenen Speicher Ereignis auszulösen haben, betrachten die Methode unter:

saveToLs(e) { 
    e.preventDefault(); 
    const newName = this.get('dogName'); 
    const ls = window.localStorage; 
    const synthEvent = new StorageEvent('storage'); 
    const eventConfig = [ 
    'storage', 
    true, 
    true, 
    'myDog', 
    ls.getItem('myDog'), 
    newName 
    ]; 

    synthEvent.initStorageEvent(...eventConfig); 

    setTimeout((() => { // ensure async queue 
    ls.setItem('myDog', newName); 
    this.dispatchEvent(synthEvent); 
    }).bind(this), 0); 
} 

... und auf der Listening-Seite:

Bitte beachten Sie die if bedingte Handhabung mögliche doppelte Updates mit dem gleichen Wert. Hier

ist ein working plunk für Sie mit

+0

Hallo zusammen! Danke für deine Antwort. Ich habe den Code auf der Seite "my-view2" hinzugefügt, aber ich kann immer noch nicht funktionieren. Ich habe sogar versucht, "value replacement" zu console.log zu ersetzen, um zu sehen, ob es LocalStorage liest, aber es wird nicht. Ich bin mir ziemlich sicher, dass ich etwas Schlechtes im Code mache, aber ich kann einfach nicht verstehen, wo. Ich habe eine PLNKR erstellt: https://plnr.r.co/edit/HCIw7ExZ2rg7XEjQMLZi?p=catalogue – unkn0wnx

+0

Die Lösung wird aufgrund des hier beschriebenen Verhaltens https://Stackoverflow.com/a/4679754/2533680, I nicht allein funktionieren werde meine Antwort mit einem Arbeitsbeispiel aktualisieren. –

+0

also gibt es keine Möglichkeit für mich, das zu tun? – unkn0wnx

Verwandte Themen