這款最小聚合物應用程序具有一個可容納「軌道」的「瀏覽器」。瀏覽器需要能夠撥打render
。軌道呈現時,會爲其影子DOM添加一個新的<p>
節點。使用Polymer.dart從動態添加的自定義元素內部操縱陰影DOM
現在,調用render
時,創建了ParagraphElement,並且沒有任何問題地找到父級「div#insert-here」,但是將新創建的ParagraphElement添加到div的子級不會在瀏覽器中呈現。
如果我們改變了代碼中插入一個新的<p>
到enteredView在ExampleBrowser的影子DOM,如預期的那樣<p>
出現在瀏覽器。爲什麼它可以用於頂層自定義元素,而不是動態創建的自定義元素?
bugTest.dart
import 'package:polymer/polymer.dart';
import 'dart:html';
@CustomTag('example-browser')
class ExampleBrowser extends PolymerElement {
@published ExampleTrack track;
ExampleBrowser.created() : super.created();
@override
void enteredView() {
track = new Element.tag('example-track')
..trackName = "Test Track";
}
void renderTrack(MouseEvent e) {
track.render();
}
}
@CustomTag('example-track')
class ExampleTrack extends PolymerElement {
@published String trackName;
ExampleTrack.created() : super.created();
void render() {
ParagraphElement testParagraph = new ParagraphElement()
..text = "I don't seem to get added to the DOM :(";
$['insert-here'].children.add(testParagraph);
}
}
定製elements.html
<script type="application/dart" src="bugTest.dart"></script>
<polymer-element name="example-browser">
<template>
<h2>Browser</h2>
<button on-click="{{renderTrack}}">Render tracks</button>
<example-track trackName={{track.trackName}}></example-track>
</template>
</polymer-element>
<polymer-element name="example-track">
<template>
<h3>{{trackName}}</h3>
<div id="insert-here"></div>
</template>
</polymer-element>
的index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>BugTest</title>
<link rel="import" href="custom-elements.html">
<script type="application/dart">export 'package:polymer/init.dart';</script>
<script src="packages/browser/dart.js"></script>
</head>
<body>
<h1>BugTest</h1>
<example-browser></example-browser>
</body>
</html>
感謝Günter的快速反應。在實際的應用程序中,重複模板中實例化的元素具有從每個軌道實例中提取的屬性。我也希望能夠根據需要重新渲染曲目。無論使用單個實例,問題似乎都會持續存在。我編輯了這個問題,以使這些要點更清晰。 –
我更新了我的答案。你應該真的重新考慮你的方法,這不是聚合物的工作原理。 –
現貨。添加void attributeChanged(old){whatever}是獲得我想要做的更好的方法。感謝Günter! –