使用js-interop将类型化数组缓冲区传递给dart中的javascript

时间:2012-12-17 04:31:37

标签: dart dart2js

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

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

使用js.array并不像我期望的那样代理它,我怎样才能将类型数组作为类型数组传递给dart中的javascript方法?

2 个答案:

答案 0 :(得分:3)

您可以直接从Dart实例化ArrayBufferUint8Array个javascript对象。

如果您只需要一个Uint8Array javascript对象:

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

  // do something with bufView
});

如果您需要ArrayBuffer javascript对象:

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

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

警告:在新版本登陆包含the pull-request #34 of js-interop之前,您必须使用以下相关性来运行上面的代码段。

dependencies:
  js:
    git: git://github.com/dart-lang/js-interop.git

答案 1 :(得分:2)

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

utils.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闭包调用。的 example.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);
  });