3

尝试调用需要类型化数组的 javascript 方法。

var arrayData = js.array(new Uint8Array.fromList(data.charCodes));

使用 js.array 并没有像我期望的那样代理它,我如何将类型化数组作为类型化数组传递给 dart 中的 javascript 方法?

4

2 回答 2

3

您可以直接从 Dart 实例化ArrayBufferUint8Arrayjavascript 对象。

如果您只需要一个Uint8Arrayjavascript 对象:

js.scoped(() {
  final charCodes = "test".charCodes;
  final bufView = new js.Proxy(js.context.Uint8Array, js.array(charCodes));

  // do something with bufView
});

如果你需要一个ArrayBufferjavascript 对象:

js.scoped(() {
  final charCodes = "test".charCodes;
  final buf = new js.Proxy(js.context.ArrayBuffer, charCodes.length);
  final bufView = new js.Proxy(js.context.Uint8Array, buf)
    ..set(js.array(charCodes));

  // do something with buf
});

基本上,每次需要使用newjavascript 运算符时,都必须使用new js.Proxy(construtor,...).

警告:在包含js-interop 的 pull-request #34 的新版本发布之前,您必须使用以下依赖项来运行上述代码片段。

dependencies:
  js:
    git: git://github.com/dart-lang/js-interop.git
于 2012-12-18T12:59:09.767 回答
2

找到的解决方案是创建一个 utils.js 并包含未加载到 js.context 中的对象的构造函数。

实用程序.js:

var xArrayBuffer=function(length) {
    return new ArrayBuffer(length); 
};

var xUint8Array=function(buf) {
    return new Uint8Array(buf);
};

在index.html中包含 utils.js

  <body>
    <script src="utils.js"></script>
    <script src="dart.js"></script>
    <script src="example.dart.js"></script>
  </body>

然后从 js.scoped 闭包调用。例子.dart

  js.scoped(() {
    var jscore = js.context.jscore;        
    var buf = js.context.xArrayBuffer(data.charCodes.length);
    var bufView = js.context.xUint8Array(buf);

    for (var i = 0; i < data.charCodes.length; i++) {
      bufView[i] = data.charCodeAt(i);
    }

    jscore.writeArrayBuffer(buf);
  });
于 2012-12-17T05:21:19.653 回答