如何通过Dart中的dart2js聚合物绑定访问非@seservable字段?

时间:2013-11-21 19:20:52

标签: dart dart-polymer

Seth Ladd的Polymer.dart示例很棒,非常有用。 observable_list示例将DateTime个实例附加到ObservableList timestamps。虽然DateTime未延伸Observable,但修改my_element.html以访问

上的字段

{{ts in timestamps}}

在Dart VM中运行时有效。例如,更改

<li>{{ts}}</li>

<li>{{ts.second}}</li>

在Dart VM上,

将访问DateTime.seconds字段。但是,当dart2js将应用程序编译为javascript时,对Polymer表达式中的字段的访问会被破坏。在这种情况下抛出异常Uncaught Error: RangeError: value 0,或者更常见的是NoSuchMethodError : method not found: 'Symbol(...)'抛出fieldname(参见示例here

如果某个类扩展Observable,则在编译为Javascript(将类@observable in this example更改为MyRow后,访问extends Observable字段将在Polymer表达式内部工作不会在javascript中抛出异常)。

当我无法向DateTime等外部类添加注释时,我该怎么办?这只是dart2js生成中的当前错误,还是Polymer.dart规范禁止从非可观察类中读取字段?以前,web_ui在编译为javascript后成功访问了dart-protobuf生成的类中的字段,所以我希望这个用例也能在Polymer.dart中获得支持。

1 个答案:

答案 0 :(得分:2)

通常,dart2js尝试树抖动和缩小代码,并且它不知道某些代码是从聚合物表达式(在内部使用镜像来解释表达式)中使用的。很可能这里发生的事情是dart2js要么删除不可观察的字段,要么以它们不可反映的方式缩小它们。

要解决此问题,您可以指示需要通过镜像保留和使用这些字段。在聚合物中,我们为此提供@reflectable注释。 (@ observable也暗示@reflectable,这就是为什么当你有@observable时它可以工作)。所以你可以在MyRow案例中使用它。

核心库中的类型字段如果变得可反射也可以工作。在这种情况下,表达起来有点难,因为您无法修改原始代码来添加此批注。相反,你可以使用@MirrorsUsed注释覆盖这些核心类型的默认行为,或者避免在聚合物表达式中使用这些字段,方法是将它们隐藏在@reflectable getter或直接用Dart代码编写的过滤器中。