js包 - 对象的接口

时间:2016-08-14 17:31:51

标签: dart dart-js-interop

使用https://pub.dartlang.org/packages/js以这种方式连接js类,可以正常工作:

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

现在我想在另一个类中公开该方法,所以我只通过复制方法解决了这个问题。当增加更多方法时,这会有效,但会增长。需要的是某种混合或继承,但不适用于此互操作类。 jselem是库名

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

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

有更优雅的方法可以解决这个问题吗?

更新以获得更好的说明

事情有效,问题在于是否有更好的方法来公开接口Javascript类的方法/属性。上面的例子很小,所以不是那么说明性的。为了更好地说明,请从此处ChartDataSethttps://github.com/google/chartjs.dart/blob/master/lib/chartjs.dart仅举例说明,在Dart一侧创建了一个Dart类StreamChartDataSet,它增加了在线阅读功能来自网址的数据。由于StreamChartDataSet无法从ChartDataSet继承或混合,因此上述解决方案提供了:

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

这是许多方法和纯机械工作。完成后,只希望ChartSettings未经修改:-)我正在处理其他事情,但使用Charjs.dart进行说明。

1 个答案:

答案 0 :(得分:2)

为了澄清,您希望能够扩展@JS()注释类,这是正确的吗?我不认为有效,因为@JS()类在编译时才真正存在。

几个选项:

  1. 有人可以开发一个代码生成器来查看@JS() - 带注释的类,并通过基本完成你正在为你做的事情来删除样板。不是超级优雅,但至少有帮助。

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

  3. 在我看来,我是一个巨大的支持者,包括扩展的构图,特别是在你没有直接控制的课程上。例如,如果JS-API从fullName更改为firstName和lastName,则只需更改getter即可维护相同的API:

    String fullName() => _js.firstName + _js.lastName;
    

    这取决于你。