【问题标题】:Dart Polymer 1.0 Behavior - method not found & getters requiredDart Polymer 1.0 行为 - 未找到方法和需要吸气剂
【发布时间】:2016-02-18 06:38:21
【问题描述】:

我想在 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),但我不知道这是否有效,因为我有一些运行时错误,我将在本文后面解释。访问底层元素的官方方式是什么?是使用 JsObject 吗?它是从父 PolymerElement 调用 Behavior 函数并传递this,还是根本不访问它?

另一个问题是我是否必须从 PolymerBase 继承。 Github wiki 上的 Behavior 示例没有这样做,但是为了访问诸如 set 之类的方法来修改 @Property 我必须从它继承。这样做的正确方法是什么?

我的最后两个问题是关于我得到的错误。一个错误要求我为我的属性实现 getter 和 setter,例如为 alignTop 添加 getter 和 setter。 最后但并非最不重要的一点是,我不能从我的自定义元素中调用updateAlignment()。它说Class 'MainApp' has no instance method 'updateAlignment'.

【问题讨论】:

  • 最后一个问题:可以加MainApp的代码吗?

标签: dart polymer polymer-1.0 dart-polymer


【解决方案1】:

1)

var ele = Polymer.dom(root);

如果你想访问元素的 DOM,这很好。
只需root 即可为您提供相同的 AFAIK。

如果你想访问元素类实例,没有什么可做的。它是this,但无论如何这在 Dart 中是隐含的。 您只能访问 mixin 中已知的内容。要让 mixin 知道“事物”,您可以创建一个接口类。

abstract class MyComponentInterface {
  void someFunction();
  int someField;
  String get someValue;
  set someValue(String value);
  ...
}

然后在 mixin 和元素类中实现接口,你就有了一个共享契约。

abstract class AlignmentBehavior implements MyComponentInterface, PolymerBase {

mixin 现在可以访问成员,因为 implementsMyComponentInterface` 声称它们将存在并且

class MyComponent extends PolymerElement with AlignmentBehavior {

将强制你执行它来履行 mixin 的合同。

2) 看起来不错

3)

另一个问题是我是否必须从PolymerBase 继承。

基本上和 1) Dart 中的任何 Polymer 元素都必须扩展 PolymerBase。为了能够从 mixin 中访问 PolymerBase 的成员,它也必须实现它。这不会导致任何限制,因为 mixin 将应用于的类无论如何都会履行该合同。

如果您不需要访问PolymerBase 提供的任何成员,则无需实现。

【讨论】:

  • 我通过使用implements 添加行为。该属性是我最初的问题alignTop 中的属性,错误消息显示Missing concrete implementation of getter 'AlignmentBehavior.alignTop'
  • 您需要使用with 而不是implements。 Implements 仅声明此类履行 X 的合同,但不向该类添加任何内容。 with 就像 extends 您真正添加成员和实现的地方。因此错误信息是正确的。您说班级有这些东西,但实际上没有;-)。
  • 还应注意,您的行为中的ready 方法应该是一个静态方法,它以this 作为第一个参数。这是为了支持定义相同生命周期方法的多种行为。
  • 感谢您的参与。我已经忘记了——我自己还没有使用过。
猜你喜欢
  • 2019-02-13
  • 2018-08-17
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 2019-11-26
  • 2018-11-16
相关资源
最近更新 更多