2

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在 Dart VM 上时将访问该字段。但是,当 dart2js 将应用程序编译为 javascript 时,对 Polymer 表达式中的字段的访问被破坏。在这种情况下会抛出异常Uncaught Error: RangeError: value 0,或者更一般地NoSuchMethodError : method not found: 'Symbol(...)'是抛出字段名(请参见此处的示例)

如果类扩展,则在编译为 Javascript 后,对 Polymer 表达式内部的字段的Observable访问工作(将本示例中的类更改为不会在 javascript 中引发异常)。@observableMyRow extends Observable

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

4

1 回答 1

2

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

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

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

于 2013-11-22T17:48:39.380 回答