我試圖訪問另一個自定義elemnent shadow根中的自定義元素的內容。自定義元素無法訪問它在shadow中的內容
index.html
只是有一個my-tag-wrapper
元素:
<!-- import HTMLs and init Polymer-->
...
<my-tag-wrapper></my-tag-wrapper>
...
my_tag_wrapper.html
包含一個段落元素的my-tag
元素:
<polymer-element name="my-tag-wrapper" >
<template>
<my-tag>
<p>wrapped my-tag contents</p>
</my-tag>
</template>
<script type="application/dart" src="my_tag_wrapper.dart"></script>
</polymer-element>
my_tag.html
只呈現它的內容:
<polymer-element name="my-tag" >
<template>
<content></content>
</template>
<script type="application/dart" src="my_tag.dart"></script>
</polymer-element>
my_tag.dart
將打印它的內容到控制檯:
@CustomTag('my-tag')
class MyTagElement extends PolymerElement {
ParagraphElement get p => this.querySelector('p');
MyTagElement.created() : super.created() {
var pe = p;
var t = (pe == null) ? null : pe.text;
print('my-tag p: ${t}');
print('my-tag outerHtml: ${outerHtml}');
}
}
然而,my_tag.dart
打印:
my-tag p: null
my-tag outerHtml: <my-tag></my-tag>
我可以知道my-tag
內容在上面的代碼?
這裏是the example repo。
編輯:
我明白這個問題,由@Günter Zöchbauer's answer提供的線索。
在其他shadowRoot中,自定義元素的內容無法在created()
的構造函數上訪問。內容可在attached()
之後訪問。
我固定my_tag.dart
:
@CustomTag('my-tag')
class MyTagElement extends PolymerElement {
ParagraphElement get p => this.querySelector('p');
MyTagElement.created() : super.created() {
_printContent(); // print null because contents is not rendered
}
@override
attached() {
super.attached();
_printContent(); // print contents
}
_printContent() {
var pe = p;
var t = (pe == null) ? null : pe.text;
print('my-tag p: ${t}');
print('my-tag outerHtml: ${outerHtml}');
}
}
我有一個誤區,認爲自定義元素的內容始終是created()
構造訪問,因爲my-tag
內容是created()
訪問時,它是在body
元素的孩子。
編輯:s/domReady/attached
通過the @Günter Zöchbauer's advice
我發現我的' - tag'可以訪問它的內容沒有'shadowRoot'訪問它。然而,通過這個答案,我注意到這些內容不會呈現在'created()'構造函數中。感謝您的回答。 –
是的,我想你是對的。 'this.querySelector'應該做的。在'created'構造函數中幾乎沒有任何東西被渲染,你不應該在一些類字段的初始化旁邊做任何事情。當你想要訪問DOM時,最好的選擇是'attach',但是隻有在'super.attached();'調用之後。 –
我確認入侵'attached()'早於'domReady()'。所以,我修復了我的解決方案。再次感謝。 –