我的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);
但我不知道如何正确检查somefile.js中是否存在OBJECT和OBJECT.somearray并在其中推送一个对象项。
答案 0 :(得分:1)
使用dart:js,您可以检查全局变量的存在:
bool exist = context.hasProperty('OBJECT');
if (exist) {
final o = context['OBJECT'];
if (!o.hasProperty('somearray')) {
o['somearray'] = new JsArray();
}
}
答案 1 :(得分:0)
你正在混淆一些事情,尤其是你JS的功能范围。我不想对你的js做出假设,但看起来好像你没有正确初始化你的OBJECT。你想在你的javascript中添加这样的东西
function myObject(){
this.array = []
}
你可以在飞镖中,正如费利克斯在评论中指出的那样创造了这个功能。有不同的选择。一种是通过dart访问JS函数:js(参见felix评论),另一种是使用js-interop库。我不是特别确定区别是什么,但我发现js-interop库有一个多更干净的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。