Dart Polymer 1.0 行为 - 找不到方法和需要吸气剂
Dart Polymer 1.0 Behavior - method not found & getters required
我想在 Dart 中编写一个简单的行为以供自定义元素使用。
@behavior
abstract class AlignmentBehavior implements PolymerBase {
@Property()
bool alignTop = false;
// more properties ...
ready() {
updateAlignment();
}
@reflectable
updateAlignment([_,__]) {
// reference to the element the Behavior is attached to.
// 1) Is that the correct way?
var ele = Polymer.dom(root);
// We need to inherit from PolymerBase to access set(...)
// 2) Is that the correct way?
set('alignTop', aTop);
// .. to more stuff
}
}
我的前两个问题已经写在代码里了。如何访问行为附加到的元素?这样做的正确方法是什么?我目前使用 Polymer.dom(root)
,但我不知道它是否有效,因为我有一些运行时错误,稍后我将在 post 中解释这些错误。访问底层元素的官方方式是什么?它使用 JsObject 吗?它是从父 PolymerElement 调用 Behavior 函数并传递 this
,还是根本不应该访问它?
另一个问题是我是否必须继承PolymerBase。 Github wiki 上的行为示例没有这样做,但为了访问 set
等方法来修改 @Property
,我必须从它继承。这样做的正确方法是什么?
我的最后两个问题是关于我遇到的错误。一个错误要求我为我的属性实现 getters 和 setters,例如为 alignTop 添加 getter 和 setter。
最后但同样重要的是,我无法从我的自定义元素中调用 updateAlignment()
。它说 Class 'MainApp' has no instance method 'updateAlignment'.
1)
var ele = Polymer.dom(root);
如果你想访问元素的DOM,这很好。
只是 root
给你相同的 AFAIK。
如果你想访问元素class实例,没有什么可做的。它是 this
但这在 Dart 中是隐含的。
您只能访问 mixin 中已知的内容。要使 "things" 为 mixin 所知,您可以创建一个接口 class.
abstract class MyComponentInterface {
void someFunction();
int someField;
String get someValue;
set someValue(String value);
...
}
然后在 mixin 和元素 class 中实现接口,你就有了一个共享契约。
abstract class AlignmentBehavior implements MyComponentInterface, PolymerBase {
mixin 现在可以访问成员,因为 implements
MyComponentInterface` 声称它们将存在并且
class MyComponent extends PolymerElement with AlignmentBehavior {
将强制您实施它以履行 mixin 的合同。
2) 看起来不错
3)
Another question is whether I have to inherit from PolymerBase
or not.
与 1) 基本相同,Dart 中的任何 Polymer 元素都必须扩展 PolymerBase
。为了能够从 mixin 中访问 PolymerBase
的成员,它也必须实现它。这不会导致任何限制,因为将应用 mixin 的 classes 无论如何都会履行该合同。
如果您不需要访问 PolymerBase
提供的任何成员,则无需实现它。
我想在 Dart 中编写一个简单的行为以供自定义元素使用。
@behavior
abstract class AlignmentBehavior implements PolymerBase {
@Property()
bool alignTop = false;
// more properties ...
ready() {
updateAlignment();
}
@reflectable
updateAlignment([_,__]) {
// reference to the element the Behavior is attached to.
// 1) Is that the correct way?
var ele = Polymer.dom(root);
// We need to inherit from PolymerBase to access set(...)
// 2) Is that the correct way?
set('alignTop', aTop);
// .. to more stuff
}
}
我的前两个问题已经写在代码里了。如何访问行为附加到的元素?这样做的正确方法是什么?我目前使用 Polymer.dom(root)
,但我不知道它是否有效,因为我有一些运行时错误,稍后我将在 post 中解释这些错误。访问底层元素的官方方式是什么?它使用 JsObject 吗?它是从父 PolymerElement 调用 Behavior 函数并传递 this
,还是根本不应该访问它?
另一个问题是我是否必须继承PolymerBase。 Github wiki 上的行为示例没有这样做,但为了访问 set
等方法来修改 @Property
,我必须从它继承。这样做的正确方法是什么?
我的最后两个问题是关于我遇到的错误。一个错误要求我为我的属性实现 getters 和 setters,例如为 alignTop 添加 getter 和 setter。
最后但同样重要的是,我无法从我的自定义元素中调用 updateAlignment()
。它说 Class 'MainApp' has no instance method 'updateAlignment'.
1)
var ele = Polymer.dom(root);
如果你想访问元素的DOM,这很好。
只是 root
给你相同的 AFAIK。
如果你想访问元素class实例,没有什么可做的。它是 this
但这在 Dart 中是隐含的。
您只能访问 mixin 中已知的内容。要使 "things" 为 mixin 所知,您可以创建一个接口 class.
abstract class MyComponentInterface {
void someFunction();
int someField;
String get someValue;
set someValue(String value);
...
}
然后在 mixin 和元素 class 中实现接口,你就有了一个共享契约。
abstract class AlignmentBehavior implements MyComponentInterface, PolymerBase {
mixin 现在可以访问成员,因为 implements
MyComponentInterface` 声称它们将存在并且
class MyComponent extends PolymerElement with AlignmentBehavior {
将强制您实施它以履行 mixin 的合同。
2) 看起来不错
3)
Another question is whether I have to inherit from
PolymerBase
or not.
与 1) 基本相同,Dart 中的任何 Polymer 元素都必须扩展 PolymerBase
。为了能够从 mixin 中访问 PolymerBase
的成员,它也必须实现它。这不会导致任何限制,因为将应用 mixin 的 classes 无论如何都会履行该合同。
如果您不需要访问 PolymerBase
提供的任何成员,则无需实现它。