2013-12-14 71 views
2
創建JS對象

我有js代碼需要被翻譯到達特:從DART

(function() { 
    var s, e; 
    s = document.createElement("script"); 
    s.src = 「//someurl.com/somefile.js"; 
    s.async = true; 
    e = document.getElementsByTagName("head")[0]; 
    e.insertBefore(s, e.firstChild); 
    this.OBJECT = this.OBJECT || {}; 
    this.OBJECT.array = this.OBJECT.somearray || []; 
})(); 

OBJECT.somearray.push({ 
    val1 : 「foo", 
    val2 : 「bar" 
}); 

基本部分嵌入腳本到的頭,我不喜歡這樣的:

ScriptElement scr = new ScriptElement() 
    ..src = "//someurl.com/somefile.js"; 
    ..async = true; 
querySelector('head').append(scr); 

但我不t知道如何正確檢查somefile.js中是否存在OBJECT和OBJECT.somearray,並在其中推送一個對象項。

+0

你以爲我沒有試圖尋找它在谷歌上鏢文檔這裏之前發佈呢?如果你能用一些示例代碼來幫助我,我會非常有幫助。 – krotov

+0

但是...文檔有示例代碼: -/[這裏也是](https://api.dartlang.org/docs/channels/stable/latest/dart_js.html)。要創建一個對象,調用'new JsObject(context ['Object'])',創建一個數組,'new JsObject(context ['Array'])''。還有'JsArray',這可能會有所幫助。我的意思是,我不知道你到底在哪裏卡住了。如果您發佈了您嘗試過的以及獲得了哪些錯誤,我們可能會更好地爲您提供幫助。 –

回答

0

你正在混合一些東西,特別是JS的函數範圍。我不想對你的js做出假設,但看起來好像你沒有正確初始化你的OBJECT。你想添加這樣的東西給你的javascript

function myObject(){ 
    this.array = [] 
} 

在飛鏢,你可以,因爲菲利克斯在評論中指出,然後創建此功能。有不同的選擇。一個是通過dart訪問JS函數:js(參見felix評論),另一個是使用js-interop庫。我不是特別確定的差異是什麼,但我覺得JS-互操作庫有一個清潔API(https://github.com/dart-lang/js-interop

import 'package:js/js.dart' as js; 
var yourObject = js.Proxy(js.context.myObject); 
yourObject.array.push("..."); 

js.interop使JavaScript調用可用的對象上,而不是使用callMethod等等,但我想它依靠的是dart2js而不是dart。

+0

更清潔的API帶有大小和速度的成本(因爲_package:js_使用_dart:mirrors_和_noSuchMethod_)。 –

1

隨着dart:js您可以檢查的全局變量與存在:

bool exist = context.hasProperty('OBJECT'); 
if (exist) { 
    final o = context['OBJECT']; 
    if (!o.hasProperty('somearray')) { 
    o['somearray'] = new JsArray(); 
    } 
}