为什么这个例子:
import "dart:html";
class SubMenuElement extends DivElement {
SubMenuElement() {
print("my element created");
}
}
给出错误:
Internal error: 'file.dart': error: line x pos y: unresolved implicit call to super constructor 'DivElement()'
SubMenuElement() {
^
错误消息的含义是什么?工作示例如何?
答案 0 :(得分:3)
DivElement没有默认构造函数。 您需要在super。
上添加命名构造函数和对命名构造函数的调用SubMenuElement.created() : super.created();
如果您派生DOM元素,则应添加with Polymer
import 'dart:html';
import 'package:polymer/polymer.dart';
class SubMenuElement extends DivElement with Polymer {
SubMenuElement.created() : super.created();
}
您尚未声明要创建Polymer元素,但只能将自定义元素用于Polymer,所以我假设您这样做。
答案 1 :(得分:2)
错误消息表示默认构造函数DivElement()
不存在。隐式调用此构造函数是因为您没有指定要调用的另一个构造函数。
话虽如此,DivElement不能直接进行子类化。但您可以通过实现DivElement而不是扩展它并委派每个调用来模拟该行为:
class MyDivElement implements DivElement {
DivElement _delegate;
MyDivElement() {
_delegate = new DivElement();
// whatever else should happen in your constructor
}
// For best performance, every member SHOULD be implemented explicitly.
String get text => _delegate.text;
Node get parentNode => _delegate.parentNode;
ShadowRoot get shadowRoot => _delegate.shadowRoot;
// But DivElement has a lot of members.
// Unused or rarely used members could also be delegated with reflection.
noSuchMethod(Invocation invocation) => reflect(_delegate).delegate(invocation);
}
答案 2 :(得分:2)
您可以按如下方式声明DivElement的子类:
import 'dart:html';
class MyDiv extends DivElement {
factory MyDiv() => new Element.tag('div', 'my-div');
MyDiv.created() : super.created();
}
工厂构造函数不是必需的,但如果你想强制构造实例,这很方便。
然后必须先将文档注册到文档中,然后才能实例化它:
main() {
document.register('my-div', MyDiv, extendsTag: 'div');
document.body.append(new MyDiv()..text = 'Hello');
}
以上内容适用于Dartium或本机实现自定义元素规范的任何浏览器(例如Chrome 33+)。要在另一个浏览器中运行,您需要添加自定义元素polyfill。您可以将其添加到pubspec:
dependencies:
custom_element: '>=0.9.0'
...
运行pub get
后,您可以将填充脚本添加到html:
<body>
<script src="packages/custom_element/custom-elements.min.js"></script>
...
</body>