dart - 如何通过 Dart 中的 dart2js 通过聚合物绑定(bind)访问非 @observable 字段?

标签 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>

将访问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/

相关文章:

flutter - 为什么primaryColorDark比primaryColor浅?

json - 如何从列表中映射 Flutter JSON 字符串?

dart - 当前在 Dart Polymer 中扩展自定义元素的方法?

dart - 您如何在Polymer Dart 1.0中监听自定义事件?

oauth-2.0 - 你如何在 dart 1.0 中使用 OAuth2?

Dart 聚合物 : How to filter elements in repeat-template?

firebase - 创建 FirebaseAuth 实例时收到错误创建并使用电子邮件和密码登录

flutter - 滚动到特定的小部件 Flutter web

dart - Flutter Stack 变化深度

dart - 如何将所需的指示器添加到纸张输入