2016-08-14 99 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)可以輕鬆完成。 –