你如何与飞镖的js互动?

时间:2013-12-15 01:08:29

标签: dart dart-js-interop

不,这与同名的其他问题不同。

看似相同的软件包似乎是这样做的,但有不同的apis。

为什么有两个?

我们应该使用哪一个?

互操作一个看起来更新并且有更好的api,但实际上并不起作用。根据文档,您应该能够转换此javascript:

var stage = new PIXI.Stage(0xFFFFFF);;
renderer = PIXI.autoDetectRenderer(800, 600);
document.body.appendChild(renderer.view);

分为:

var pixi = new js.Proxy(js.context.PIXI.Stage, 0xffffff);
var renderer = js.context.PIXI.autoDetectRenderer(400, 400);
document.body.append(renderer.view);

但是当你尝试编译时会出现错误:

dart2js
Error occured:/Users/doug/megac/client/public/dart/index.dart:7:27:
Warning: No member named 'PIXI' in class 'Proxy'.
var pixi = new js.Proxy(js.context.PIXI.Stage, 0xffffff);
^^^^^^^^^^^^^^^

所以... js:dart?这是你应该使用的吗?

编辑:顺便说一句,对于任何偶然发现这一点的人来说,还有一个关于如何缩小dart-js互操作桥操作当前不起作用的开放式错误http://code.google.com/p/dart/issues/detail?id=15795&thanks=15795&ts=1388068177。最初的问题是在2013年5月报道的,从那时起就没有采取任何行动,所以不要屏住呼吸。

1 个答案:

答案 0 :(得分:6)

Js interop以package:js开头。它是使用window.postMessage构建的。

后来添加dart:js以提供更好的性能并减少已编译的js文件的大小。基本上目标是:

  • 删除范围和生命周期手动处理
  • 避免noSuchMethod使编译大小尽可能低
  • 重命名对象以使api更容易理解

dart:js 准备就绪后, package:js 已被重写,以便在封面下使用 dart:js

包:js 提供了一个更简单的Api,其代价是增加了js的大小(因为包:js 使用 dart:mirrors noSuchMethod )。

使用包完成同样的事情:js dart:js

import 'package:js/js.dart' as js;

main() {
  var pixi = new js.Proxy(js.context.PIXI.Stage, 0xffffff);
  var renderer = js.context.PIXI.autoDetectRenderer(400, 400);
  document.body.append(renderer.view);
}

import 'dart:js' as js;

main() {
  var pixi = new js.JsObject(js.context['PIXI']['Stage'], [0xffffff]);
  var renderer = js.context['PIXI'].callMethod('autoDetectRenderer', [400, 400]);
  document.body.append(renderer['view']);
}