Polymer 2.0 通过 Id 访问嵌套模板内部的元素
Polymer 2.0 Access Element Inside of Nested Template by Id
Polymer 通过 this.$['foo'] 通过 id 提供对元素的访问。但是,我发现我无法通过 id 访问嵌套模板中的元素。
<template>
<vaadin-dialog id="dialog" >
<template>
<work-order-new id="workordernew" on-submitted="_onWorkOrderSubmitted"> </work-order-new>
</template>
</vaadin-dialog>
</template>
在这种情况下,this.$.dialog 有效,但 this.$.workordernew 无效。您能否通过 id 访问嵌套模板内的元素?如果可以,如何访问?
我也尝试了下面的两种方法,但都没有用。
Polymer.dom(this.root).querySelector():
this.$$(选择器)
我看到了很多关于这个问题的答案,但是 none 解决了我的问题。
您面临的问题严格来说不是 Polymer 问题,而是更多地反映了 Vaadin 在幕后所做的事情。
创建 vaadin-dialog
元素时,模板的实际内容将复制到另一个元素 - vaadin-dialog-overlay
- 而不是保留在原始元素中。
覆盖元素插入到 document
层,因此您可以抓取它进行查询:
let vaadinOverlay = document.querySelector('vaadin-dialog-overlay');
一旦你有了叠加层,就很容易找到你的 work-order-new
元素:
let workOrder = vaadinOverlay.$.content.querySelector('#workordernew');
在这种情况下真正的问题是:您为什么要尝试直接访问您的元素?
通常,在使用组件时,如果到了需要直接访问组件的地步,通常表明应用程序的设计存在问题。
<base href="https://polygit.org/vaadin-dialog+vaadin+v1.0.0-alpha1/vaadin-button+vaadin+v1.0.0-alpha1/polymer+^2.0.0/components/">
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="vaadin-dialog/vaadin-dialog.html">
<link rel="import" href="vaadin-button/vaadin-button.html">
<my-element></my-element>
<dom-module id="my-element">
<template>
<vaadin-dialog opened>
<template>
<work-order-new id="workorder"></work-order-new>
</template>
</vaadin-dialog>
</template>
</dom-module>
<dom-module id="work-order-new">
<template>
<h4>Work Order</h4>
<input type="text" id="inputbox" value="Default Value">
</template>
</dom-module>
<script>
// Extend Polymer.Element base class
class MyElement extends Polymer.Element {
static get is() {
return 'my-element';
}
constructor() {
super();
}
connectedCallback() {
super.connectedCallback();
/**
* Fetch the reference to the overlay.
**/
let vaadinOverlay = document.querySelector('vaadin-dialog-overlay');
/**
* Fetch the reference to the `work-order-new` element.
**/
let workOrder = vaadinOverlay.$.content.querySelector('#workorder');
/**
* Wait for the overlay to be setup, this is just to show
* that we can now use the reference to the `work-order-new`
* element.
**/
setTimeout(() => {
let inputBox = workOrder.$.inputbox;
inputBox.value = `Changed from my-element`;
}, 1500);
}
}
customElements.define(MyElement.is, MyElement);
class WorkOrderNewElement extends Polymer.Element {
static get is() {
return 'work-order-new';
}
constructor() {
super();
}
connectedCallback() {
super.connectedCallback();
}
}
customElements.define(WorkOrderNewElement.is, WorkOrderNewElement);
</script>
在 Polymer 3 中,可以这样做
let vaadinOverlay = document.querySelector('vaadin-dialog-overlay');
let workorder = vaadinOverlay.$.content.shadowRoot.querySelector('#workorder');
Polymer 通过 this.$['foo'] 通过 id 提供对元素的访问。但是,我发现我无法通过 id 访问嵌套模板中的元素。
<template>
<vaadin-dialog id="dialog" >
<template>
<work-order-new id="workordernew" on-submitted="_onWorkOrderSubmitted"> </work-order-new>
</template>
</vaadin-dialog>
</template>
在这种情况下,this.$.dialog 有效,但 this.$.workordernew 无效。您能否通过 id 访问嵌套模板内的元素?如果可以,如何访问?
我也尝试了下面的两种方法,但都没有用。
Polymer.dom(this.root).querySelector():
this.$$(选择器)
我看到了很多关于这个问题的答案,但是 none 解决了我的问题。
您面临的问题严格来说不是 Polymer 问题,而是更多地反映了 Vaadin 在幕后所做的事情。
创建 vaadin-dialog
元素时,模板的实际内容将复制到另一个元素 - vaadin-dialog-overlay
- 而不是保留在原始元素中。
覆盖元素插入到 document
层,因此您可以抓取它进行查询:
let vaadinOverlay = document.querySelector('vaadin-dialog-overlay');
一旦你有了叠加层,就很容易找到你的 work-order-new
元素:
let workOrder = vaadinOverlay.$.content.querySelector('#workordernew');
在这种情况下真正的问题是:您为什么要尝试直接访问您的元素?
通常,在使用组件时,如果到了需要直接访问组件的地步,通常表明应用程序的设计存在问题。
<base href="https://polygit.org/vaadin-dialog+vaadin+v1.0.0-alpha1/vaadin-button+vaadin+v1.0.0-alpha1/polymer+^2.0.0/components/">
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="vaadin-dialog/vaadin-dialog.html">
<link rel="import" href="vaadin-button/vaadin-button.html">
<my-element></my-element>
<dom-module id="my-element">
<template>
<vaadin-dialog opened>
<template>
<work-order-new id="workorder"></work-order-new>
</template>
</vaadin-dialog>
</template>
</dom-module>
<dom-module id="work-order-new">
<template>
<h4>Work Order</h4>
<input type="text" id="inputbox" value="Default Value">
</template>
</dom-module>
<script>
// Extend Polymer.Element base class
class MyElement extends Polymer.Element {
static get is() {
return 'my-element';
}
constructor() {
super();
}
connectedCallback() {
super.connectedCallback();
/**
* Fetch the reference to the overlay.
**/
let vaadinOverlay = document.querySelector('vaadin-dialog-overlay');
/**
* Fetch the reference to the `work-order-new` element.
**/
let workOrder = vaadinOverlay.$.content.querySelector('#workorder');
/**
* Wait for the overlay to be setup, this is just to show
* that we can now use the reference to the `work-order-new`
* element.
**/
setTimeout(() => {
let inputBox = workOrder.$.inputbox;
inputBox.value = `Changed from my-element`;
}, 1500);
}
}
customElements.define(MyElement.is, MyElement);
class WorkOrderNewElement extends Polymer.Element {
static get is() {
return 'work-order-new';
}
constructor() {
super();
}
connectedCallback() {
super.connectedCallback();
}
}
customElements.define(WorkOrderNewElement.is, WorkOrderNewElement);
</script>
在 Polymer 3 中,可以这样做
let vaadinOverlay = document.querySelector('vaadin-dialog-overlay');
let workorder = vaadinOverlay.$.content.shadowRoot.querySelector('#workorder');