扩展 PaperDialog 并通过 Dart 调用 toggle()
Extending PaperDialog and calling toggle() via Dart
我正在尝试扩展 PaperDialog 以便我可以设置它的样式。我正在尝试使用 this solution 中的方法 3,但使用的是 Dart 而不是 JS。这是我的组件。
<link rel="import" href="packages/polymer/polymer.html">
<link rel="import" href="packages/paper_elements/paper_dialog.html">
<polymer-element name="hc-dialog" extends="paper-dialog" noscript>
<template>
<link href="hc-dialog.css" rel="stylesheet" type="text/css" />
<shadow></shadow>
</template>
</polymer-element>
该组件似乎正确呈现到 DOM - 我可以通过向组件添加 opened="true" 来验证它是否正常运行 - 这呈现得很好,例如:
<hc-dialog opened="true" closeSelector="[dismissive]" transition="paper-dialog-transition-bottom">
<div layout horizontal>
<span flex></span>
<paper-button raised dismissive>Done</paper-button>
</div>
</hc-dialog>
但我不希望它自动显示,当我试图找到一种通过 Dart 在此组件上调用 toggle() 的方法时,问题就来了。在上面链接的解决方案(working JS Fiddle)中,它是通过 JS 调用的:
<script>
Polymer('x-dialog-3', {
toggle: function() {
this.$.dialog3.toggle();
}
});
</script>
但是,如果我尝试在 dart 中实现相同的目的,我将无法检索到具有 toggle() 方法的组件:
shadowRoot.querySelector('hc-dialog').toggle();
结果为 Object.noSuchMethod。通过反射检查返回的对象可以清楚地表明:
var he = shadowRoot.querySelector('hc-dialog');
var cm = reflect(he).type;
while (cm != null) {
print(cm);
cm = cm.superclass;
}
给出:
ClassMirror on 'HtmlElement' (:1)
ClassMirror on 'Element' (:1)
ClassMirror on 'Node' (:1)
ClassMirror on 'EventTarget' (:1)
ClassMirror on 'NativeFieldWrapperClass2' (:1)
ClassMirror on 'Object' (:1)
==> 我的对话框不是 PaperDialog/CoreOverlay,这就是为什么我不能在上面调用 toggle() 的原因。
这种方法有什么问题?我怎样才能获得可以调用 toggle() 的东西?
Polymer.dart 核心元素和纸质元素只是 Polymer.js 元素的包装。此类元素不支持扩展,因为 Dart class 无法扩展 JS class。
我正在尝试扩展 PaperDialog 以便我可以设置它的样式。我正在尝试使用 this solution 中的方法 3,但使用的是 Dart 而不是 JS。这是我的组件。
<link rel="import" href="packages/polymer/polymer.html">
<link rel="import" href="packages/paper_elements/paper_dialog.html">
<polymer-element name="hc-dialog" extends="paper-dialog" noscript>
<template>
<link href="hc-dialog.css" rel="stylesheet" type="text/css" />
<shadow></shadow>
</template>
</polymer-element>
该组件似乎正确呈现到 DOM - 我可以通过向组件添加 opened="true" 来验证它是否正常运行 - 这呈现得很好,例如:
<hc-dialog opened="true" closeSelector="[dismissive]" transition="paper-dialog-transition-bottom">
<div layout horizontal>
<span flex></span>
<paper-button raised dismissive>Done</paper-button>
</div>
</hc-dialog>
但我不希望它自动显示,当我试图找到一种通过 Dart 在此组件上调用 toggle() 的方法时,问题就来了。在上面链接的解决方案(working JS Fiddle)中,它是通过 JS 调用的:
<script>
Polymer('x-dialog-3', {
toggle: function() {
this.$.dialog3.toggle();
}
});
</script>
但是,如果我尝试在 dart 中实现相同的目的,我将无法检索到具有 toggle() 方法的组件:
shadowRoot.querySelector('hc-dialog').toggle();
结果为 Object.noSuchMethod。通过反射检查返回的对象可以清楚地表明:
var he = shadowRoot.querySelector('hc-dialog');
var cm = reflect(he).type;
while (cm != null) {
print(cm);
cm = cm.superclass;
}
给出:
ClassMirror on 'HtmlElement' (:1)
ClassMirror on 'Element' (:1)
ClassMirror on 'Node' (:1)
ClassMirror on 'EventTarget' (:1)
ClassMirror on 'NativeFieldWrapperClass2' (:1)
ClassMirror on 'Object' (:1)
==> 我的对话框不是 PaperDialog/CoreOverlay,这就是为什么我不能在上面调用 toggle() 的原因。
这种方法有什么问题?我怎样才能获得可以调用 toggle() 的东西?
Polymer.dart 核心元素和纸质元素只是 Polymer.js 元素的包装。此类元素不支持扩展,因为 Dart class 无法扩展 JS class。