Вот рабочий пример: я редактирую ваш код.Ваш код почти готов, я сделал небольшие изменения:
DEMO
import { PolymerElement, html } from '@polymer/polymer/polymer-element.js';
import './x-counter.js';
class IndexApp extends PolymerElement {
constructor() {
super();
this.a = 15;
this.addEventListener('value-changed', this._valueChanged)
}
static get template() {
return html`
<div>Parent element value : [[a]]</div>
<x-counter
val="{{a}}" >
</x-counter>
`;
}
_valueChanged(x){
this.set('a', x.detail.val);
}
}
customElements.define('index-app', IndexApp);
И х-счетчик:
import {LitElement, html, property} from '@polymer/lit-element';
class XCounter extends LitElement {
static get properties() {
return {
val: {
type: Number
}
}
}
render() {
return html`
<style>
button, p {
display: inline-block;
}
</style>
<div id="div1">Hi</div>
<div id="div2">This is a Lit </div>
<button @click="${this.decrement}" aria-label="decrement">-</button>
<p>value: ${this.val}</p>
<button @click="${this.increment}" aria-label="increment">+</button></body>
`;
}
decrement() {
this.val--;
}
increment() {
this.val++;
}
updated(props) {
console.log("generated event", props);
this.dispatchEvent(new CustomEvent('value-changed', { bubbles: true, composed: true, detail: {val:this.val} }));
}
}
customElements.define('x-counter', XCounter);