【问题标题】:this.$.element error in dom-repeatdom-repeat 中的 this.$.element 错误
【发布时间】:2018-04-12 06:08:35
【问题描述】:

我有一个带有这个模板的聚合物元素: 元素:<my-tiendas>

<template is="dom-repeat" items="{{tiendas}}" as="tienda">
    <my-tiendaitem tienda="{{tienda}}"></my-tiendaitem>
</template>

元素my-tiendaitem 是另一个聚合物元素,具有显示列表项的功能:

<div class="card-container">
            <div class="back" id="back">
                <paper-icon-button icon="my-icons:mode-edit" id="updBt" class="edit-class"></paper-icon-button>
                <paper-icon-button icon="my-icons:delete" id="delBt" class="delete-class"></paper-icon-button>
                <paper-icon-button icon="my-icons:more-vert" id="moreBt" class="more-class"></paper-icon-button>
            </div>
            <div class="front" id="front">
                <iron-icon icon="my-icons:store" slot="item-icon"></iron-icon>
                <div class="content" id="content">
                    <span class="nombre">{{tienda.tiendaNombre}}</span>
                    <span class="direccion">{{tienda.tiendaAddress}}</span>
                </div>
                <div class="circle"></div>
            </div>
        </div>

my-tiendaitem 中,我有一个功能可以让我向左滑动并显示操作按钮,为此我需要一些事件监听器,例如:

 ready() {
            super.ready();

            this._front = this.$.front;
            this._back = this.$.back;

            this._updBt = this.$.updBt;
            this._delBt = this.$.delBt;
            this._moreBt = this.$.moreBt;

            this.onStart = this.onStart.bind(this);
            this.onMove = this.onMove.bind(this);
            this.onEnd = this.onEnd.bind(this);
            this.update = this.update.bind(this);

            this.updClick = this.updClick.bind(this);
            this.delClick = this.delClick.bind(this);
            this.moreClick = this.moreClick.bind(this);
            this.updateBecauseOfClick = this.updateBecauseOfClick.bind(this);

            this.target = null;

            this.startX = 0;
            this.currentX = 0;
            this.dragginCard = false;
            this.screenX = 0;
            this.causeClick = false;
            this.addEventListener();

            requestAnimationFrame(this.update);
        }

        addEventListener(){
            this._front.addEventListener('touchstart', this.onStart);
            this._front.addEventListener('touchmove', this.onMove);
            this._front.addEventListener('touchend', this.onEnd);

            this._updBt.addEventListener('click', this.updClick);
            this._delBt.addEventListener('click', this.delClick);
            this._moreBt.addEventListener('click', this.moreClick);
        }

我总是在控制台中遇到错误:

无法读取未定义的属性“addEventListener”

这是因为this.$.front 未定义。有没有办法解决这个问题?我正在使用最后一个版本的 Polymer 2。

【问题讨论】:

  • 这意味着该元素不是静态的。 dom-ifdom-repeat 内的关联元素是否在 my-tiendaitem 内?
  • @tony19,你是对的 my-tiendaitem 是一个子元素,它将在 dom-repeat 中动态创建,但我并没有尝试动态访问 dom 对象,因为错误在子元素内部有自己的 dom 的元素
  • @Dracco 我没有访问外部 dom 元素,它是从子元素而不是父元素访问子元素内的 dom 元素,请检查我共享的图像
  • 是的,我的错。我在下面发布了一个答案。当您在组件外部提供模板时,代码带来了混乱,这与组件内部发生的事情完全没有区别。它也恰好是dom-repeat,而关于this.$.*** 未定义的问题中有99% 是关于访问动态内容。
  • @JoseRaulPerera 你能更新问题以显示my-tiendaitem 的模板吗?了解“front”是如何定义的以及addEventListener 是如何相关的会很有帮助。 jsbin/codepen 等中的 repro 会有所帮助。

标签: javascript polymer-2.x


【解决方案1】:

问题似乎与您的自定义 addEventListener 方法掩盖了元素的 native addEventListener 有关,Polymer 试图在设置 dom-repeat 子项时调用该方法。您必须重命名您的 addEventListener 方法(例如,改名为 _addEventListener)。

class Foo extends Polymer.Element {
  // addEventListener() { // DON'T NAME IT THIS
  _addEventListener() {
    ...
  }
}

demo

【讨论】:

  • 完美,这就是问题所在,非常感谢您的帮助
【解决方案2】:

要在元素中定位动态创建的节点,请使用 Polymer.dom(this.root).querySelector() 或简写 this.$$(selector)

您可以在 Automatic node finding 部分的 Polymer 文档中阅读更多相关信息

【讨论】:

  • 感谢您的支持,但我并不是要在 dom-repeat 中动态查找节点,我正在做的是在子元素的影子 dom 中引用 DOM 对象,如果您看到有两个元素,子元素应该自己管理,这就是我使用 this.$.domelement 的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多