【发布时间】:2014-02-23 23:35:57
【问题描述】:
在运行我的 chrome 扩展的 dart2js 编译版本时遇到以下问题:
Uncaught TypeError: Object #<JsObject> has no method 'where$1'
我创建了一个最小的例子:
background.dart
import 'dart:js';
void main() {
print("main()...");
context['js_list'] = new JsObject.jsify(["aaa", "bbb"]);
}
popup.dart
import 'dart:js';
var backgroundPage = context["chrome"]["extension"].callMethod("getBackgroundPage", []);
void main() {
print("main():...");
testJsList(backgroundPage['js_list']);
}
testJsList(List<String> jsList) {
print("testJsList(): jsList = $jsList");
print("testJsList(): ['aaa', 'bbb'] = ${new JsObject.jsify(['aaa', 'bbb'])}");
jsList.where((e) => e == "bbb").forEach(print);
}
在 Chromium (Dartium) 上运行时:
main():...
testJsList(): jsList = [aaa, bbb]
testJsList(): ['aaa', 'bbb'] = [aaa, bbb]
bbb
在 Chrome (dart2js -> V8) 上运行时:
main():...
testJsList(): jsList = aaa,bbb
testJsList(): ['aaa', 'bbb'] = [aaa, bbb]
Uncaught TypeError: Object #<JsObject> has no method 'where$1'
很明显,Dart VM 处理 JS Interop 与编译的 javascript 略有不同。 jsList 的打印方式不同,在第二种情况下是“错误”类型的“jsList”。
更新: 看起来问题是由三个 {dart:js, dart2js, chrome API} 引起的,因为临时创建的 JsObject 在 Dartium 和 dart2js 场景中都可以正常工作。
【问题讨论】:
标签: dart dart-js-interop