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。上面的例子只是最小的,所以不是说明性的。为了获得更好的说明,请从此处获取 ChartDataSet
:https://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 直到编译时才真正存在。
几个选项:
有人可以开发一个代码生成器来查看 @JS()
-注释的 class,并通过基本上为您做的事情来删除样板。不是特别优雅,但至少有帮助。
您可以针对 package:js 提交错误以支持扩展。
但在我看来,我是组合优于扩展的坚定支持者,尤其是在 class 你不能直接控制的情况下。例如,如果 JS-API 从 fullName 更改为 firstName 和 lastName,您只需更改 getter:
即可保持相同的 API
String fullName() => _js.firstName + _js.lastName;
不过这取决于你。
使用 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。上面的例子只是最小的,所以不是说明性的。为了获得更好的说明,请从此处获取 ChartDataSet
:https://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 直到编译时才真正存在。
几个选项:
有人可以开发一个代码生成器来查看
@JS()
-注释的 class,并通过基本上为您做的事情来删除样板。不是特别优雅,但至少有帮助。您可以针对 package:js 提交错误以支持扩展。
但在我看来,我是组合优于扩展的坚定支持者,尤其是在 class 你不能直接控制的情况下。例如,如果 JS-API 从 fullName 更改为 firstName 和 lastName,您只需更改 getter:
即可保持相同的 APIString fullName() => _js.firstName + _js.lastName;
不过这取决于你。