从Dart创建js对象

Create js Objects from Dart

本文关键字:对象 js 创建 Dart      更新时间:2023-09-26

我有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);

但是我不知道如何正确地检查OBJECT和OBJECT.somearray是否存在于somefile.js中,并在其中推送一个对象项

使用dart:js,您可以使用检查全局变量的存在

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

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

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

正如Felix在评论中指出的那样,在dart中你可以创建这个函数。有不同的选择。一种是通过dart:JS访问JS函数(请参阅felix注释),另一种是使用jsinterop库。我不特别确定区别是什么,但我发现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。