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(...)'
因为字段名被抛出(参见示例 here )
如果一个类扩展 Observable
然后访问@observable
编译为 Javascript 后,字段在 Polymer 表达式内部工作(将类 MyRow
in this example 更改为 extends Observable
不会在 javascript 中引发异常)。
当我无法向 DateTime
等外部类添加注释时,我该怎么办? ?这只是 dart2js 生成中的当前错误,还是 Polymer.dart 规范会禁止读取不可观察类中的字段?此前,web_ui
成功访问我们的 dart-protobuf 中的字段编译为 javascript 后生成的类,所以我希望这个用例也能在 Polymer.dart 中获得支持。
最佳答案
一般来说,dart2js 尝试对代码进行 tree-shake 和缩小,并且它不知道某些代码是从聚合物表达式中使用的(它在内部使用镜像来解释表达式)。这里发生的情况很可能是 dart2js 要么删除不可观察的字段,要么以不可反射的方式缩小它们。
要解决此问题,您可以指示需要通过镜像保留和使用这些字段。在聚合物中,我们为此提供了 @reflectable 注释。 (@observable 也意味着 @reflectable,这就是为什么当你有 @observable 时它会起作用)。因此您可以在 MyRow
情况下使用它。
核心库中类型的字段如果变得可反射也可以工作。在这种情况下表达起来有点困难,因为你无法修改原始代码来添加这个注释。相反,您可以使用 @MirrorsUsed 注释来覆盖这些核心类型的默认行为,或者通过将它们隐藏在 @reflectable getters 或直接用 Dart 代码编写的过滤器中来避免在聚合物表达式中使用这些字段。
关于dart - 如何通过 Dart 中的 dart2js 通过聚合物绑定(bind)访问非 @observable 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20130020/