我们正在从 Angular 5 升级到 Angular 6。我们有一个共享库,但遇到了构建错误。作为一家 Java 商店,我们养成了将组件方法和属性标记为私有的习惯。在 Angular 6 中构建我们的库时(转换并使用新的库 CLI 功能后),我们得到:
Property 'getCurrentYear' is private and only accessible within class.
实际上,模板 html 中使用的任何属性或方法都不能再在组件类上标记为私有。当然,我们可以通过删除“private”修饰符来解决这个问题。当我们使用 Angular 5 生成库时,情况并非如此https://github.com/raphael-volt/ng2-testable-lib https://github.com/raphael-volt/ng2-testable-lib.
奇怪的是,这只发生在编译我们的库时。我们将应用程序升级到 Angular 6,该应用程序在模板中的组件/用法上也具有私有属性和方法,并且没有任何问题。
我们发现错误了吗?是否有我们没有遵守的最佳实践?
在 Angular 中,我们有两种编译模型
默认情况下,使用开发版本,即ng serve
我们得到 JIT 编译。这就是它的工作原理。应用程序代码与角度编译器一起由浏览器下载。在运行时,当向应用程序发出请求时,浏览器中的 JIT 编译器会在执行应用程序代码之前对其进行编译。
与生产版本即ng build --prod
我们得到 AoT 编译,角度应用程序是预编译的。因此,这意味着浏览器加载可执行代码,以便它可以立即呈现应用程序,而无需先等待编译应用程序。
打字稿public
没关系但是private
does
来自 Angular 文档
All data bound https://stackoverflow.com/a/39367574/5695162属性必须是 TypeScript 公共的
特性。 Angular 永远不会绑定到 TypeScript 私有属性。
事实上,它确实绑定到private
属性,但不在AoT mode
Why AOT Compiler requires public properties, while non-AOT allows private properties? https://github.com/angular/angular/issues/11978
通过 JIT,我们将所有代码转换为 ES5,然后在运行时进行绑定。所有可见性修饰符都会在这个过程中丢失,所以如果你说的话也没关系public
or private
为了那个原因。
另一方面,通过 AoT,我们为模板生成一些打字稿代码,这些代码将尝试访问这些字段。如果他们是private
,他们根本无法访问这些属性,因此,您需要将它们作为public
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)