2014-07-22 75 views
5

我試圖訪問另一個自定義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

回答

2

因爲my-tagcontent節點p成爲my-tag-wrapper.shadowRoot一個孩子。

可以使用

(shadowRoot.querySelector('content') as ContentElement).getDistributedNodes()[0]; 
+0

我發現我的' - tag'可以訪問它的內容沒有'shadowRoot'訪問它。然而,通過這個答案,我注意到這些內容不會呈現在'created()'構造函數中。感謝您的回答。 –

+1

是的,我想你是對的。 'this.querySelector'應該做的。在'created'構造函數中幾乎沒有任何東西被渲染,你不應該在一些類字段的初始化旁邊做任何事情。當你想要訪問DOM時,最好的選擇是'attach',但是隻有在'super.attached();'調用之後。 –

+0

我確認入侵'attached()'早於'domReady()'。所以,我修復了我的解決方案。再次感謝。 –