Дарт: Динамическое использование полимерных пользовательских вкладок и полимерных пользовательских страниц не работает
Мы хотели бы динамически использовать полимер-пользовательские вкладки и полимер-пользовательские страницы. следующий статический пример работает нормально (выбранный атрибут установлен правильно, запускается событие on-Polymer-Select)
<polymer-ui-tabs selected="{{selectedTab}}" on-polymer-select="{{mymethod}}">
<span>One</span>
<span>Two</span>
<span>Three</span>
</polymer-ui-tabs>
<polymer-ui-pages selected="{{selectedTab}}" on-polymer-select="{{mymethod2}}" flex>
<span>One</span>
<span>Two</span>
<span>Three</span>
</polymer-ui-pages>
При динамическом построении dom событие on-Polymer-Select никогда не запускается, и выбранный атрибут устанавливается только для Polymer-UI-вкладок.
@CustomTag('ve-result-dyn')
class ResultElementDyn extends PolymerElement {
Element tabElement;
Element pageElement;
@published dynamic selectedTab;
ResultElementDyn.created(): super.created() {
buildDom();
}
@override
void ready() {
selectedTab = '1';
}
void setSelectedInTab() {
print('in setSelectedInTab $selectedTab');
}
void setSelectedInPage() {
print('in setSelectedInPage $selectedTab');
}
void buildDom(){
print('in buildDom');
tabElement = new Element.tag('polymer-ui-tabs');
tabElement.setAttribute("id","dtabs");
tabElement.setAttribute("selected","{{selectedTab}}");
tabElement.setAttribute("on-polymer-select","{{setSelectedInTab}}");
Element spanelement = new SpanElement();
spanelement.innerHtml = 'One';
tabElement.children.add(spanelement);
spanelement = new SpanElement();
spanelement.innerHtml = 'Two';
tabElement.children.add(spanelement);
spanelement = new SpanElement();
spanelement.innerHtml = 'Three';
tabElement.children.add(spanelement);
this.shadowRoot.append(tabElement);
this.shadowRoot.append(new DivElement());
pageElement = new Element.tag('polymer-ui-pages');
pageElement.setAttribute("id","dpages");
pageElement.setAttribute("selected","{{selectedTab}}");
pageElement.setAttribute("on-polymer-select","{{setSelectedInPage}}");
spanelement = new SpanElement();
spanelement.innerHtml = 'Page 1';
pageElement.children.add(spanelement);
spanelement = new SpanElement();
spanelement.innerHtml = 'Page 2';
pageElement.children.add(spanelement);
spanelement = new SpanElement();
spanelement.innerHtml = 'Page 3';
pageElement.children.add(spanelement);
this.shadowRoot.append(pageElement);
}
Любая идея? С наилучшими пожеланиями, Аня
1 ответ
Я нашел способ решить это. Я до сих пор не знаю, можно ли заставить Polymer оценивать выражения усов, созданные во время выполнения.
Обновить
Полимер 0.15.0 добавляет injectBoundHtml
, Используемые выражения уже должны быть где-то использованы, чтобы Smoke знал, как сгенерировать для них код. См. https://groups.google.com/a/dartlang.org/d/msg/web/uqri0fpGH10/dPm169WUiUwJ для получения дополнительной информации.
Конец обновления
Потребовалось всего несколько небольших изменений.
Я закомментировал оригинальную строку и добавил новый код в строку ниже.
Вы можете сохранить результат StreamSubscription selSubscr = tabElement.onPolymerSelect.listen((e) => setSelectedInTab(e));
и позвонить selSubscr.cancel();
когда вы больше не заинтересованы в этом событии.
library polymer_tabs_issue;
import 'dart:html';
import 'package:polymer/polymer.dart';
import 'package:polymer_ui_elements/polymer_ui_tabs/polymer_ui_tabs.dart';
import 'package:polymer_ui_elements/polymer_ui_pages/polymer_ui_pages.dart';
@CustomTag('ve-result-dyn')
class ResultElementDyn extends PolymerElement {
PolymerUiTabs tabElement;
PolymerUiPages pageElement;
@published dynamic selectedTab;
ResultElementDyn.created() : super.created() {
buildDom();
}
@override
void ready() {
selectedTab = '1';
}
void setSelectedInTab(CustomEvent e) {
print('in setSelectedInTab $selectedTab, ${e.detail}');
}
void setSelectedInPage(CustomEvent e) {
print('in setSelectedInPage $selectedTab, ${e.detail}');
}
void buildDom() {
print('in buildDom');
tabElement = new Element.tag('polymer-ui-tabs');
tabElement.setAttribute("id", "dtabs");
//tabElement.setAttribute("selected", "{{selectedTab}}");
tabElement.bind('selected', new PathObserver(this, 'selectedTab'));
//tabElement.setAttribute("on-polymer-select", "{{setSelectedInTab}}");
tabElement.onPolymerSelect.listen((e) => setSelectedInTab(e));
Element spanelement = new SpanElement();
spanelement.innerHtml = 'One';
tabElement.children.add(spanelement);
spanelement = new SpanElement();
spanelement.innerHtml = 'Two';
tabElement.children.add(spanelement);
spanelement = new SpanElement();
spanelement.innerHtml = 'Three';
tabElement.children.add(spanelement);
this.shadowRoot.append(tabElement);
this.shadowRoot.append(new DivElement());
pageElement = new Element.tag('polymer-ui-pages');
pageElement.setAttribute("id", "dpages");
//pageElement.setAttribute("selected", "{{selectedTab}}");
pageElement.bind('selected', new PathObserver(this, 'selectedTab'));
//pageElement.setAttribute("on-polymer-select", "{{setSelectedInPage}}");
pageElement.onPolymerSelect.listen((e) => setSelectedInPage(e));
spanelement = new SpanElement();
spanelement.innerHtml = 'Page 1';
pageElement.children.add(spanelement);
spanelement = new SpanElement();
spanelement.innerHtml = 'Page 2';
pageElement.children.add(spanelement);
spanelement = new SpanElement();
spanelement.innerHtml = 'Page 3';
pageElement.children.add(spanelement);
this.shadowRoot.append(pageElement);
//this.templateInstance.firstNode.append(pageElement);
}
}