D3.js dartlang互操作js和d3集成在dart中不起作用

D3.js dartlang互操作js和d3集成在dart中不起作用,d3.js,interop,dart,angular-dart,D3.js,Interop,Dart,Angular Dart,我正在尝试使用AngularDart获得一个简单的d3.js代码片段。我有一个简单的组件: @NgComponent(...) class LineChart { Element element; List<num> _items; var d3; @NgOneWayOneTime('data') set results ( List<num> results ) { _items = results; _drawLineChart(

我正在尝试使用AngularDart获得一个简单的
d3.js
代码片段。我有一个简单的组件:

@NgComponent(...)
class LineChart {
  Element element;
  List<num> _items;
  var d3;

  @NgOneWayOneTime('data')
  set results ( List<num> results ) {
    _items = results;
    _drawLineChart(_items);
  }

  LineChart(this.element) {
    d3 = context['d3'];
    var temp = d3.callMethod('selectAll', [new JsObject.jsify([element])]);
    var temp1 = temp.callMethod('append', ['div']);
    temp1.callMethod('html', ['Hello Me']);
  }
}
:

递归地将类似JSON的Dart对象集合转换为JavaScript对象集合,并向其返回
JsObject
代理

对象
必须是
映射
可编辑
,其内容也会转换。映射和Iterables被复制到一个新的JavaScript对象。原语和其他可传递值直接转换为它们的JavaScript类型,所有其他对象都被代理

当你打电话时:

var temp = d3.callMethod('selectAll', [new JsObject.jsify([element])]);
您不需要
.jsify
元素,因为根据:

代理和自动转换 在JsObject上设置属性或向Javascript方法或函数传递参数时,Dart对象会自动转换或代理为Javascript对象。访问JavaScript属性或从JavaScript调用Dart闭包时,JavaScript对象也会转换为Dart

函数和闭包以可调用的方式进行代理。分配给JavaScript属性的Dart闭包由JavaScript中的函数代理。从Dart访问的JavaScript函数由JsFunction代理,JsFunction有一个apply方法来调用它

以下类型直接传输而非代理:

  • “基本”类型:null、bool、num、String、DateTime
  • 斑点
  • 事件
  • HtmlCollection
  • 图像数据
  • 键区
  • 节点
  • 节点主义者
  • TypedData,包括其子类,如Int32List,但不包括ByteBuffer
  • 窗口
元素
继承自
节点
,并自动转换。因此,您只需拨打:

var temp = d3.callMethod('selectAll', [element]);
此外,您不需要创建临时变量,因为dart有快捷方式!您可以这样做:

LineChart(this.element) {
  d3 = context['d3'];
  d3.callMethod('selectAll', [element])
    .callMethod('append', ['div'])
    .callMethod('html', ['Hello Me']);
}

你能在一个小例子中重现这个吗?如果是这样,那么它可能是dart:js中的一个bug,我可以看一看。@JustinFagnani我可以试着这样做。几天前,当我调试这个程序时,我认为它实际上是chrome&chrome bug。我需要写一个小片段来演示。
LineChart(this.element) {
  d3 = context['d3'];
  d3.callMethod('selectAll', [element])
    .callMethod('append', ['div'])
    .callMethod('html', ['Hello Me']);
}