js 包 - 对象接口

js package - interface to object

使用 https://pub.dartlang.org/packages/js 以这种方式连接 js class,效果很好:

@JS()
class ObjJS {
  external ObjJS();
  external String fullName();
}

现在我想在另一个class中公开该方法,所以我只是通过复制该方法解决了这个问题。这行得通,但会随着添加更多方法而增长。需要某种混合或继承,但不接受此互操作 class。 jselem 是库名

class ObjDart {
  jselem.ObjJS _objJS = new jselem.ObjJS();

  String fullName(){
    return _objJS.fullName();
  }
}

有没有更优雅的方法来解决这个问题?


更新以获得更好的说明

一切正常,问题是是否有更好的方法来公开接口 Javascript class 的 methods/properties。上面的例子只是最小的,所以不是说明性的。为了获得更好的说明,请从此处获取 ChartDataSethttps://github.com/google/chartjs.dart/blob/master/lib/chartjs.dart 只是为了说明,假设在 Dart 端创建了一个 Dart class StreamChartDataSet,它添加了从 url 读取在线数据的功能。由于 StreamChartDataSet 不能从 ChartDataSet 继承或混合,上面的解决方案给出了:

class StreamChartDataSet {
   ChartDataSet _chartDataSet;
   ...
   String get label => _chartDataSet.label;
   set label(fial String v) => _chartDataSet.label(v);
    ...
}

这是很多方法和纯机械工作。完成此操作后,希望 ChartSettings 保持不变 :-) 我正在处理其他事情,但使用 Charjs.dart 进行说明。

澄清一下,您希望能够扩展带注释的 @JS() class,对吗?我认为行不通,因为 @JS() class 直到编译时才真正存在。

几个选项:

  1. 有人可以开发一个代码生成器来查看 @JS()-注释的 class,并通过基本上为您做的事情来删除样板。不是特别优雅,但至少有帮助。

  2. 您可以针对 package:js 提交错误以支持扩展。

但在我看来,我是组合优于扩展的坚定支持者,尤其是在 class 你不能直接控制的情况下。例如,如果 JS-API 从 fullName 更改为 firstName 和 lastName,您只需更改 getter:

即可保持相同的 API
String fullName() => _js.firstName + _js.lastName;

不过这取决于你。