javascript - Polymer 3 devguide "Listener on outside elements"中的事件示例引发异常

标签 javascript web-component polymer-3.x

我已经为 snippets 创建了示例来自 Polymer 3 开发指南。此示例无法编译,因为 _myLocationListener 未定义并且在构造函数中使用。监听器也没有在开发指南片段中定义。

如何初始化 this._myLocationListener 属性。

import {html, PolymerElement} from '@polymer/polymer/polymer-element.js';

/**
 * @customElement
 * @polymer
 */
class XcustomElementEventHandlingApp extends PolymerElement {
    static get template() {
        return html`
      <style>
        :host {
          display: block;
          border: dotted;
          background: aliceblue;
        }
      </style>
      <h2>Hello [[prop1]]!</h2>
      <button on-click="handleClick">Kick Me</button>
      <div id="child-el-01">Please, check the logs in Console (dev tools).</div>
    `;
    }

    static get properties() {
        return {
            prop1: {
                type: String,
                value: 'xcustom-element-event-handling-app'
            }
        };
    }

    constructor() {
        super();

        this._boundListener = this._myLocationListener.bind(this);
    }

    ready() {
        super.ready();
        this.addEventListener('click', this._onClick);

        const childElement = this.shadowRoot.getElementById('child-el-01');
        childElement.addEventListener('click', this._onClick.bind(this));
        childElement.addEventListener('mouseover', event => this._onHover(event));


        console.log('(this, the) custom element added to DOM.');
    }

    handleClick() {
        console.log('Ow!');
    }

    _onClick(event) {
        this._makeCoffee();
    }

    _makeCoffee() {
        console.log('in _makeCoffee()')
    }

    _onHover(event) {
        console.log('_onHover(ev) called');
        console.log(JSON.stringify(event));
    }

    connectedCallback() {
        super.connectedCallback();
        window.addEventListener('hashchange', this._boundListener);
    }

    disconnectedCallback() {
        super.disconnectedCallback();
        window.removeEventListener('hashchange', this._boundListener);
    }
}

window.customElements.define('xcustom-element-event-handling-app', XcustomElementEventHandlingApp);

package.json:

{
  "name": "xcustom-element-event-handling",
  "description": "event handling demo. From dev guide.",
  "dependencies": {
    "@polymer/polymer": "^3.0.0"
  },
  "devDependencies": {
    "@webcomponents/webcomponentsjs": "^2.0.0",
    "wct-browser-legacy": "^1.0.0"
  }
}

抛出以下异常:

Uncaught TypeError: this._myLocationListener.bind is not a function
at new XcustomElementEventHandlingApp (xcustom-element-event-handling-app.js:36)

最佳答案

在上面的示例中,主要思想是您是否想从该自定义元素外部监听事​​件。您可以在connectedCallback中设置一个监听器,并使用disconnectedCallback将其删除,然后在事件发生后在元素中分配一个函数。 类似的东西

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <script src="https://unpkg.com/@webcomponents/webcomponentsjs/webcomponents-loader.js"></script>
    <script type="module" src="x-custom.js"></script>
  </head>
  <body>
    <button>This button not in the element</button>
    <x-custom></x-custom>
  </body>
</html>

x-custom.js:

import { PolymerElement, html } from 'https://unpkg.com/@polymer/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7606191a0f1b13043645584658465b060413584744" rel="noreferrer noopener nofollow">[email protected]</a>/polymer-element.js';

class XCustom extends PolymerElement {
  static get template() {
        return html`<h2>Hello </h2> `;
  }

    constructor() {
        super();
        this._boundListener = this._myLocationListener.bind(this);
    }

    connectedCallback() {
        super.connectedCallback();
        window.addEventListener('click', this._boundListener);
    }

    disconnectedCallback() {
        super.disconnectedCallback();
        window.removeEventListener('click', this._boundListener);
    }
    _myLocationListener(){
        alert('This click comes from index.html - out of this element')
    }
}

window.customElements.define('x-custom', XCustom);

DEMO

关于javascript - Polymer 3 devguide "Listener on outside elements"中的事件示例引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53334284/

相关文章:

javascript - 在 Amcharts 中增加饼图的大小

javascript - 如何在 TypeScript 中将 API 请求的响应转换为带有 `class-transformer` 的类实例?

javascript - Polymer 3 - 有没有办法将 html 模板提取到单独的 html 文件中?

javascript - v-on :click does not work (vue. js)

javascript - 在 Web 组件中扩展元素时, "is"语法有何意义?

javascript - 基于 REST 的 polymer 应用程序

javascript - Polymer, IE11 dom-repeat no rendering option 标签

routing - 无法在 PolymerJS 3.0 的路由函数中访问已更改的数组 "value"? (使用 iron-ajax 和 app-route 元素)

javascript - 元素未更新 html Polymer V3 上的值

javascript - Ng-Click - 尝试在我的 Firebase 中传递数据