2012-12-17 45 views
3

試圖調用需要類型化數組的javascript方法。從js-interop向dart傳遞鍵入的數組緩衝區

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

使用js.array不代理它,我期待的樣子,我怎麼可能通過類型數組作爲一個類型數組中鏢JavaScript方法?

回答

3

可以實例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 
+0

我檢查了你的提交,這也應該適用於Uint16Array,Uint32Array,是否正確? –

+0

是的,它應該工作。這不是[js-interop](https://github.com/dart-lang/js-interop)中的錯誤,而是一種解決方法,因爲Chrome中的某些JavaScript函數(如'ArrayBuffer'或'Uint8Array')沒有應用函數並且不能實例化。 –

2

找到的解決方案是創建一個utils.js幷包含未在js.context中加載的對象的構造函數。

utils.js:

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

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

附上utils.js在的index.html

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