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>
将访问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中获得支持。
答案 0 :(得分:2)
通常,dart2js尝试树抖动和缩小代码,并且它不知道某些代码是从聚合物表达式(在内部使用镜像来解释表达式)中使用的。很可能这里发生的事情是dart2js要么删除不可观察的字段,要么以它们不可反映的方式缩小它们。
要解决此问题,您可以指示需要通过镜像保留和使用这些字段。在聚合物中,我们为此提供@reflectable注释。 (@ observable也暗示@reflectable,这就是为什么当你有@observable时它可以工作)。所以你可以在MyRow
案例中使用它。
核心库中的类型字段如果变得可反射也可以工作。在这种情况下,表达起来有点难,因为您无法修改原始代码来添加此批注。相反,你可以使用@MirrorsUsed注释覆盖这些核心类型的默认行为,或者避免在聚合物表达式中使用这些字段,方法是将它们隐藏在@reflectable getter或直接用Dart代码编写的过滤器中。