簡體   English   中英

從 Dart 中的 JavaScript 對象獲取任意屬性

[英]Getting an arbitrary property from a JavaScript object in Dart

編輯:這是一個說明我的問題的最小項目。 您可以通過將其提供給瀏覽器來查看所描述的錯誤: 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是我想要的數據。

好的,這是一個有趣的,節日快樂:)

看起來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);

一旦我們有了一個任意的 JavaScript 對象,就調用它:

var properties = jsToMap(toy.getData());
print(properties);

我不得不修改@matanlurey 解決方案,以便它適用於 dart 2.12 並且是遞歸的。

import 'dart:js';

/// A workaround to deep-converting an object from JS to a Dart Object.
Object jsToDart(jsObject) {
  if (jsObject is JsArray || jsObject is Iterable) {
    return jsObject.map(jsToDart).toList();
  }
  if (jsObject is JsObject) {
    return Map.fromIterable(
      getObjectKeys(jsObject),
      value: (key) => jsToDart(jsObject[key]),
    );
  }
  return jsObject;
}

List<String> getObjectKeys(JsObject object) => context['Object']
    .callMethod('getOwnPropertyNames', [object])
    .toList()
    .cast<String>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM