2

我有需要翻译成 Dart 的 js 代码:

(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);

但我不知道如何正确检查 OBJECT 和 OBJECT.somearray 是否存在于 somefile.js 中并将对象项推入其中。

4

2 回答 2

1

使用dart:js,您可以使用以下命令检查全局变量是否存在:

bool exist = context.hasProperty('OBJECT');
if (exist) {
  final o = context['OBJECT'];
  if (!o.hasProperty('somearray')) {
    o['somearray'] = new JsArray();
  }
}
于 2013-12-14T20:30:03.247 回答
0

您正在混淆一些东西,尤其是您的 JS 的功能范围。我不想对你的 js 做出假设,但看起来你没有正确初始化你的 OBJECT。你想在你的javascript中添加这样的东西

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

正如 Felix 在评论中指出的那样,您可以在 dart 中创建此函数。有不同的选择。一种是通过 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。

于 2013-12-14T18:36:04.987 回答