首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过与dart2js在Dart中的聚合物结合来获得一个不可观测的场?

如何通过与dart2js在Dart中的聚合物结合来获得一个不可观测的场?
EN

Stack Overflow用户
提问于 2013-11-21 19:20:51
回答 1查看 166关注 0票数 2

Seth的Polymer.dart示例非常棒,而且非常有用。列表示例将DateTime实例附加到ObservableList timestamps。虽然DateTime没有扩展Observable,但是修改element.html以访问

{{ts in timestamps}}

在Dart VM中运行时工作。例如,更改

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

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

在Dart VM上访问DateTime.seconds字段。然而,当dart2js将应用程序编译为javascript时,对聚合物表达式中字段的访问就会中断。在本例中抛出异常Uncaught Error: RangeError: value 0,或者更一般地抛出字段名的NoSuchMethodError : method not found: 'Symbol(...)' (参见示例这里)。

如果一个类扩展了Observable,那么在编译到Javascript之后,对@observable字段的访问可以在聚合物表达式中工作(将类MyRow 在这个例子中更改为extends Observable不会在javascript中引发异常)。

当我无法向DateTime这样的外部类添加注释时,我能做什么呢?这仅仅是dart2js生成中的一个当前错误,还是Polymer.dart规范禁止从不可观察的类中读取字段?以前,web_ui在编译到javascript之后成功地访问了达特-原虫生成的类中的字段,所以我希望这个用例也能在Polymer.dart中获得支持。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-22 17:48:39

通常,dart2js试图对代码进行树抖动和精简,但它不知道有些代码是从聚合物表达式中使用的(聚合物表达式内部使用镜像来解释表达式)。很可能发生的事情是,dart2js要么删除不可观测的字段,要么以无法反射的方式缩小它们。

要解决这个问题,您可以指示需要保留这些字段并通过镜像使用这些字段。在聚合物中,我们为此目的提供了@reflectable注释。(@可观察也意味着@reflectable,这就是当您拥有“可观察性”时它工作的原因)。所以您可以在MyRow的情况下使用它。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20130020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档