从 Dart 中的 JavaScript 对象获取任意属性

ahi*_*erg 4 javascript dart dart-js-interop

编辑:这是一个说明我的问题的最小项目。您可以通过将其提供给浏览器来查看所描述的错误:pub get然后是pub serve(dartium) 或pub build --mode=debug(其他浏览器)。

如何通过 JsObjectImpl 从 Dart 访问任意 JavaScript 属性?我正在使用 ace.js 库和 Dart 的互操作,我从打字稿接口改编而来,我调用的方法返回一个带有键值对的普通 javascript 对象。

Dart 给了我一个 JsObjectImpl,它不能转换为 Map 或 JsObject,两者都有 [] 访问器。它令人困惑地似乎是从不推荐使用的 JSObject 继承的(注意“s”在后者中大写),它没有 [] 访问器,因此我无法获取数据。

一些错误信息:

  1. 当试图从JsObjectImpl到JsObject铸造:
    ORIGINAL EXCEPTION: type 'JSObjectImpl' is not a subtype of type 'JsObject' of 'obj' where JSObjectImpl is from dart:js JsObject is from dart:js。使用时我也收到类似的消息Map

  2. 纵观调试器中的对象,我可以令人沮丧的看到JS观点,但物业没有在飞镖对象:
    Chrome 调试器显示带有键“4”的属性
    4: Object是我想要的数据。

mat*_*rey 9

好的,这是一个有趣的,节日快乐:)

似乎Map不支持package:js. 所以有几件事:

  1. 归档https://github.com/dart-lang/sdk/issues/28194
  2. 向您发送了介绍解决方法PR

对于感兴趣的各方,我们可以使用浏览器原生Object.keys

@JS()
library example;

import 'package:js/js.dart';

/// A workaround to converting an object from JS to a Dart Map.
Map jsToMap(jsObject) {
  return new Map.fromIterable(
    _getKeysOfObject(jsObject),
    value: (key) => getProperty(jsObject, key),
  );
}

// Both of these interfaces exist to call `Object.keys` from Dart.
//
// But you don't use them directly. Just see `jsToMap`.
@JS('Object.keys')
external List<String> _getKeysOfObject(jsObject);
Run Code Online (Sandbox Code Playgroud)

一旦我们有一个任意的 JavaScript 对象,就调用它:

var properties = jsToMap(toy.getData());
print(properties);
Run Code Online (Sandbox Code Playgroud)