【问题标题】:Dart: Extend HTMLElement with abstract classDart:用抽象类扩展 HTMLElement
【发布时间】:2017-07-20 10:49:42
【问题描述】:

我正在尝试使用以下设计模式编写一些东西:

void main() 
{
    document.registerElement('abs-test', Test);
    TestExtend test = new TestExtend();
    document.body.append(test);
}

abstract class Test extends HtmlElement
{
    Test.created() : super.created();
    factory Test() => new Element.tag('abs-test')..text = "test";
}

class RedTest extends Test
{
    TestExtend() : super() => style.color = 'red';  
}

我的目标是创建一个注册到抽象类“Test”的自定义 HtmlElement。这个抽象类“Test”将具有 Test 类型的所有元素都需要具有的一些属性。在此示例中,所有类型为 Test 的元素都需要将单词“test”作为其文本。

但是,我希望那时只允许用户创建具有更具体属性的“Test”子类。在这个例子中,我们有 RedTest,然后将 Test 的颜色设置为红色。生成的 HTML 将是:

<abs-test style="color:red;">test</abs-test>

我有两个问题:

1) 是否可以调用父类的工厂构造函数? (如果没有,是否可以以不需要工厂构造函数的不同方式扩展 HtmlElement)

2) 是否可以用抽象类扩展 HtmlElement?

我已经用不同的构造函数测试了一段时间,但无法使其工作。谁能给点建议?

【问题讨论】:

    标签: dart


    【解决方案1】:

    你用一个类注册一个标签,这样浏览器就可以为你实例化它。如果这不是 1:1 的关系,浏览器就无法知道要实例化哪个类。

    因此

    你需要

    • 每个类都有不同的标签
    • 为每个标签注册一个具体(非抽象)类

    通常可以在抽象类的工厂构造函数中调用子类的构造函数

    factory Test() => new RedTest()..text = "test";
    

    在 Dart 中是有效的,但是因为扩展一个元素需要返回

    new Element.tag('abs-test')
    

    这行不通,因为您不能同时返回两者。

    您需要使用不同的标签注册每个具体的子类,例如

    document.registerElement('abs-test-red', TestRed);
    document.registerElement('abs-test-blue', TestBlue);
    

    【讨论】:

    • 谢谢 - 这是合乎逻辑的。
    • 在扩展原生 html 元素时需要注意,这些实例在 html 中使用 is 属性指定。假设MyButton 继承自ButtonElement,那么 html 中的一个实例由&lt;button is="my-button"&gt; 指定我用了几个小时调试第一次意识到这一点...... :-)
    • 哈哈,我刚看到这个 - 有同样的问题。希望我早点回来查看 cmets!
    猜你喜欢
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多