2016-08-14 63 views
1

使用https://pub.dartlang.org/packages/js接口一个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,它增加了从url中读取在线数据的功能。由于StreamChartDataSet不能继承或ChartDataSet混入上面的解决方案提供了:

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

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

+1

我不明白是什么问题。 –

+0

嗨,首先,问题中的链接是错误的,现在已更正。这涉及到js 0.6包,而不是dart:js。最小的例子并不是说明性的,所以我尝试了一个,希望更具说明性。 –

回答

2

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

一对夫妇的选择:

  1. 有人可能会开发一个代码生成器,着眼于@JS() -annotated类,这样做基本上你正在做的事情为您删除的样板。不是超级优雅,但至少有帮助。

  2. 你可以针对包提交一个bug:js来支持扩展。

在我看来,尽管如此,我是一个超越扩展的构图的巨大支持者,尤其是对于你不直接控制的类。例如,如果从全名到firstName和lastName的JS-API的变化,您可以通过只改变你的getter保持相同的API:

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

这虽然是给你的。

+0

感谢您的回答。啊哈,是的,类是生成的,这在调试时很明显。事实上,许多情况下可以通过聚合解决,然后像'ChartDataSet get chartDataSet => _chartDataSet'这样的方法解决。我会去做另一个人)1)可以轻松完成。 –