【问题标题】:Polymer ready() and event listenersPolymer ready() 和事件监听器
【发布时间】:2014-11-18 14:57:11
【问题描述】:

在遵循聚合物网站上关于自定义事件创建和委托 (https://www.polymer-project.org/articles/communication.html) 的示例时,我遇到了奇怪的行为。当标签更改时,我有聚合物选项卡射击我的自定义事件,现在我正在尝试我的另一个自定义元素来收听事件并反应,但是我缺少一些我缺少的事情,因为事件没有从内部被拿起ready() 函数。但是,如果我将它绑定到窗口,我可以看到它没有任何问题地触发,所以第二双眼睛将不胜感激:)

这是在标签更改时触发事件的自定义元素:

<polymer-element name="pm-tabmenu">
    <template>
        <style>
            :host {
                display:block;
            }
        </style>
        <paper-tabs selected="1" id="tabmenu">
            <paper-tab id="pm-tabmenu-all" state="all">All</paper-tab>
            <paper-tab id="pm-tabmenu-wip" state="wip">In Progress</paper-tab>
            <paper-tab id="pm-tabmenu-finished" state="finished">Finished</paper-tab>
        </paper-tabs>
    </template>
    <script>

        Polymer({
            ready: function () {
                var tabs = this.$.tabmenu;
                tabs.addEventListener('core-select', function (event) {
                    if (event.detail.isSelected) {
                        this.fire("pmtabmenuselect", {
                            state: event.detail.item.getAttribute('state')
                        });
                        alert(event.detail.item.getAttribute('state'));                         
                    }
                });
            }
        });
    </script>
</polymer-element>

这就是我想在另一个自定义元素中捕获事件的方式:

<polymer-element name="pm-list">
    <template>
        <style>
            :host {
                display:block;
            }
        </style>
        <h1> Current filter: {{filter}}</h1>
    </template>
    <script>
        window.addEventListener('pmtabmenuselect', function (e) {
            alert("This does fire");
        });
        Polymer({
            filter: "Not yet defined",
            ready: function () {
                this.addEventListener('pmtabmenuselect', function (e) {
                    alert("This does not fire");
                });
            }
        });
     </script>
</polymer-element>

在索引文件中,两个元素都包含在内,然后被调用,但没有部分,因为我认为目前不需要它。

<core-header-panel flex main>
            <core-toolbar class="medium-tall">
                <paper-icon-button icon="menu" core-drawer-toggle></paper-icon-button>
                <div flex>Tests</div>
                <paper-icon-button icon="search"></paper-icon-button>
                <paper-icon-button icon="more-vert"></paper-icon-button>

                <div class="bottom fit" horizontal layout>
                    <pm-tabmenu flex style="max-width: 600px;"></pm-tabmenu>
                </div>
            </core-toolbar>
            <pm-list></pm-list>
        </core-header-panel>

【问题讨论】:

    标签: javascript polymer dom-events


    【解决方案1】:

    您的问题是缺少如何使用这些 pm-listpm-tabmenu 元素。
    您是在另一个 Polymer 元素中使用它们还是直接在主体中使用它们?

    我还建议使用数据绑定而不是事件(您可以在pm-tabmenu 元素中发布paper-tabs 元素的selected 属性并对其进行绑定。

    如果您想使用自定义事件并且 pm-list 和 ´pm-tabmenu` 元素是同级元素,您必须手动将事件发送给同级元素(请参阅 here 了解更多信息)。

    您还可以考虑使用 &lt;core-signals&gt; 元素来实现 pubsub 类型的行为(请参阅 here 了解更多信息)。

    这是一个带有事件的工作示例,并假设两个元素都是兄弟:

    http://jsbin.com/wexov/11/edit


    更新:

    您的代码不起作用的原因是因为您将 pmtabmenuselect 事件的 EventListener 添加到您的 pm-list 元素中,这是错误的元素。这只有在您也不会在 pm-list 元素内触发此事件时才有效(这不是 Polymer 问题,而是一般事件/javascript 事件)。

    您在pm-tabmenu 中触发pmtabmenuselect 事件,这或多或少是pm-list 元素的兄弟。无法在 pm-list 元素中直接处理此事件,因为它会冒泡。

    唯一的解决方案是在core-header-panel 中处理事件并在pm-list 元素内再次触发它(如Polymer docs 中所述)

    【讨论】:

    • 我已经添加了我打算使用这些元素的方式。这个想法是在页面上有一些独立的组件,并且通过广播自定义事件,每个组件都可以做出相应的反应。我有点困惑为什么这不起作用,因为我认为代码本身没有问题,这个范围或 shadowDOM 相关吗?至于向野外广播的独立组件,似乎 实际上可能是前进的方向。
    • 我编辑了这篇文章,以进一步描述您的代码为什么不起作用。
    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 2020-05-06
    • 2020-11-29
    • 2019-12-02
    • 1970-01-01
    • 2023-03-14
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多