試圖調用需要類型化數組的javascript方法。從js-interop向dart傳遞鍵入的數組緩衝區
var arrayData = js.array(new Uint8Array.fromList(data.charCodes));
使用js.array不代理它,我期待的樣子,我怎麼可能通過類型數組作爲一個類型數組中鏢JavaScript方法?
試圖調用需要類型化數組的javascript方法。從js-interop向dart傳遞鍵入的數組緩衝區
var arrayData = js.array(new Uint8Array.fromList(data.charCodes));
使用js.array不代理它,我期待的樣子,我怎麼可能通過類型數組作爲一個類型數組中鏢JavaScript方法?
可以實例ArrayBuffer
和Uint8Array
直接從達特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
找到的解決方案是創建一個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);
});
我檢查了你的提交,這也應該適用於Uint16Array,Uint32Array,是否正確? –
是的,它應該工作。這不是[js-interop](https://github.com/dart-lang/js-interop)中的錯誤,而是一種解決方法,因爲Chrome中的某些JavaScript函數(如'ArrayBuffer'或'Uint8Array')沒有應用函數並且不能實例化。 –