【问题标题】:Polymer 2.0 not able to get child from idPolymer 2.0 无法从 id 获取孩子
【发布时间】:2018-05-25 23:04:26
【问题描述】:

我对 Polymer 有点陌生,最近遇到了问题。我动态创建了我的 Web 组件的一定数量的实例,我希望能够从我的父组件调用这些实例的方法,但即使有答案我也不知道该怎么做我在网上找到的。

这是我尝试调用子方法的父方法(e.detail.id 与我要访问的孩子的特定实例的 id 匹配):

childObj: function(e) {
     var name = "selectObj"+e.detail.id;
     this.$.name.hello();
},

还有我孩子的基本方法:

hello: function() {
     console.log("hello");
}

名称获得的 ID 存在,但我仍然收到此错误

TypeError: Polymer.dom(...).querySelector(...) is null

我也尝试将this.$.name.hello() 替换为this.$$('#selectObj'+e.detail.id),但仍然出现同样的错误。

以下是我创建子元素的方法:

newObj: function() {
            var dynamicSelect = document.createElement("pbd-object-select");
            dynamicSelect.num = this.nbObj;
            var newId = "selectObj" + this.nbObj;
            dynamicSelect.id = newId;  
            Polymer.dom(this.root).querySelector("#listeObjet").appendChild(dynamicSelect);
        },

【问题讨论】:

    标签: polymer parent-child polymer-2.x


    【解决方案1】:

    您尝试查询该元素的方式存在两个问题。其中之一是通过这样做:

    this.$.name.hello();
    

    您基本上是在寻找一个 id 为“name”的元素,而不是一个 id 等于变量 name 的元素。比如:

    this.$[name].hello();
    

    总体上可能会更好,但在您的特定情况下仍然会有一些问题。 this.$ 只是通过 ID 轻松获取元素的“快捷方式”,但是,它只是一个对象,其中引用了元素连接时存在并具有 id 的元素。因此,它不适用于有条件包含的元素(例如在 dom-ifs 中)或动态生成的元素,例如您的情况。

    您可以只使用 getElementById 方法,就像在普通 JS 中一样,请记住您是在元素中查询,而不是在 document 中查询。所以它会是这样的:

    this.shadowRoot.getElementById("selectObj"+e.detail.id).hello()
    

    【讨论】:

    • 首先,感谢您的回答,它帮助我理解了shadowDom的问题。但是即使您进行了更正,我仍然有同样的错误,唯一的区别是我在我的 html 中创建了一个元素,而所有其他元素都是动态创建的。在 html 中创建的元素上,hello 函数被很好地调用,但对于其他元素,我仍然收到错误“TypeError:this.shadowRoot.getElementById(...) is null”。我编辑了我的第一条评论,以显示我的孩子是如何动态创建的,如果它无论如何相关。
    • @ligmagma 好吧,我在那里写的是基础知识。有关您必须调试的更多详细信息,请查看 ID 是否正确,如果计算的 ID 正确...例如,对我来说,没有知道你的代码的其余部分以及this. nbObj 是什么听起来你每次都在生成相同的 ID,所以只找到第一个是正常的..
    • 好吧,我只是将我的代码格式化为不超过每一行,但我试图访问的 ID 已经存在,但我仍然无法访问它,我不知道为什么
    • @ligmagma 对于您在此处粘贴的详细信息,我无话可说。只是尝试逐步调试它。例如,我不知道事件是如何发生的应该被childObj 捕获被调度和监听.. 你确定你在它的细节对象中得到了 id 吗?
    • 实际上最终它与 this.$$('#id').hello() 一起工作,从我发现的 this.$$ 函数中,您可以在 shadow dom 中找到元素,不像这个。$ 一个。奇怪的是,我已经尝试过了,但没有奏效,但最终我的问题得到了解决,所以仍然很高兴。感谢您的回答帮助我更好地理解 shadow dom 问题!
    猜你喜欢
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2022-09-27
    相关资源
    最近更新 更多