Использование Dart JS для взаимодействия с классами ES6 - PullRequest
0 голосов
/ 11 сентября 2018

JavasScript:

class MyClass {

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

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

Dart:

@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.0, angular 5.0.0, js 0.6.1+1 и dartdevc через webdev.

1 Ответ

0 голосов
/ 11 сентября 2018

Обычно взаимодействие JS полагается на подъем функций, чтобы гарантировать, что класс JS старого стиля находится в области видимости. Классы ES6, однако, не подняты и недоступны там, где их ожидает Дарт. Есть несколько способов сделать класс доступным для Дартса:

Размещение объекта класса в окне

Это помещает класс в ту же область, в которую будет добавлено определение функции. В JavaScript:

class MyClass { ... }

window.MyClass = MyClass;

Создание объекта модуля

Вы также можете поместить класс в своего рода псевдомодуль или пространство имен. В JavaScript:

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

Который затем доступен на myModule.myClass в дротике:

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