<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://polygit.org/components/webcomponentsjs/webcomponents-loader.js"></script>
<link rel="import" href="set-dog-name.html">
<link rel="import" href="display-dog-name.html">
</head>
<body>
<display-dog-name></display-dog-name>
<set-dog-name></set-dog-name>
</body>
</html>
<link rel="import" href="https://polygit.org/components/polymer/polymer-element.html">
<link rel="import" href="https://polygit.org/components/iron-input/iron-input.html">
<dom-module id="set-dog-name">
<template>
<form action="saveToLs">
<iron-input bind-value="{{dogName}}">
<input is="iron-input" placeholder="Change your dog's name...">
</iron-input>
<button type="submit" on-click="saveToLs">Save</button>
</form>
</template>
<script>
class SetDogName extends Polymer.Element {
static get is() { return 'set-dog-name'; }
static get properties() {
return { dogName: { type: String } };
}
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);
}
}
customElements.define(SetDogName.is, SetDogName);
</script>
</dom-module>
<link rel="import" href="https://polygit.org/components/polymer/polymer-element.html">
<dom-module id="display-dog-name">
<template>
<!-- bind to the "owner" property -->
<p>The name of my dog is <b>[[dogName]]</b></p>
</template>
<script>
class DisplayDogName extends Polymer.Element {
static get is() { return 'display-dog-name'; }
// configure the owner property
static get properties() {
return {
dogName: {
type: String,
value: 'Bender'
},
boundCallback: {
type: Object
}
};
}
connectedCallback() {
super.connectedCallback();
const lsDogName = localStorage.getItem('myDog');
if (typeof lsDogName === 'string' && lsDogName.length > 0) {
this.set('dogName', lsDogName);
}
this.boundCallback = this.handleStorageUpdate.bind(this);
window.addEventListener('storage', this.boundCallback);
}
disconnectedCallback() {
window.removeEventListener('storage', this.boundCallback);
}
handleStorageUpdate(e) {
const currentDogName = this.get('dogName');
if (e.key !== 'myDog' || e.newValue === currentDogName) return;
this.set('dogName', e.newValue);
}
}
customElements.define(DisplayDogName.is, DisplayDogName);
</script>
</dom-module>