【问题标题】:Using Dart JS interop with ES6 classes使用 Dart JS 与 ES6 类互操作
【发布时间】:2019-02-16 00:03:04
【问题描述】:

JavaScript:

class MyClass {

    constructor() {
        console.log("MyClass instance created");
        this.answer = 42;
    }
}

let example = new MyClass();
console.log(example.answer);

飞镖:

@JS()
library interop_test;

import 'package:js/js.dart';

@JS()
class MyClass {
  external int get answer;
  external set answer(int value);
}

创建互操作类MyClass的实例

MyClass myClass = MyClass();

结果:

异常:TypeError:dart.global.MyClass 不是构造函数

我还尝试将 external MyClass();external factory MyClass(); 添加到 @JS() 带注释的类中,但得到了相同的消息。如果我在互操作类中添加@anonymous 注释,异常就会消失,但我无法访问实例成员。 (但我不明白为什么这需要匿名注释)

我正在使用 dart 2.0.0angular 5.0.0js 0.6.1+1dartdevcwebdev

【问题讨论】:

    标签: dart dart-js-interop dart-dev-compiler


    【解决方案1】:

    通常 JS 互操作将依赖函数提升来确保旧式 JS 类在范围内。然而,ES6 类没有被提升,并且在 Dart 期望的地方不可用。有几种不同的方法可以让 Dart 使用该类:

    将类对象放在窗口上

    这会将类置于函数定义将被提升到的同一范围内。在 JavaScript 中:

    class MyClass { ... }
    
    window.MyClass = MyClass;
    

    创建模块对象

    您还可以将类放在某种伪模块或命名空间中。在 JavaScript 中:

    class MyClass { ... }
    var myModule = { MyClass: MyClass };
    

    然后可以在 Dart 中的 myModule.myClass 访问:

    @JS('myModule.myClass')
    class MyClass { ... }
    

    【讨论】:

    • 两个建议都很好用!惊人的。谢谢。
    • 如果我理解正确,这意味着手动编辑js库。如果您在脚本标签中导入它,这将需要一个本地副本。还有其他不需要这样做的方法吗?
    • 我在脚本文件中添加了 window.Myclass= Myclass 但我收到错误 dart.global.Myclass is not a constructor。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多