Angular 角度6私人方法

Angular 角度6私人方法,angular,shared-libraries,private,Angular,Shared Libraries,Private,我们正在从5升级到6。我们有一个共享库,我们得到了构建错误。作为一家Java商店,我们养成了将组件方法和属性标记为私有的习惯。在Angular 6中,在构建库时(转换并使用新的库CLI功能后),我们得到: 实际上,html模板中使用的任何属性或方法都不能再在组件类上标记为private。当然,我们可以通过删除“private”修饰符来解决这个问题。在angular 5中,当我们使用 奇怪的是,这只发生在编译我们的库时。我们将一个应用升级到angular 6,它在模板中的组件/用法上也有私有属性和

我们正在从5升级到6。我们有一个共享库,我们得到了构建错误。作为一家Java商店,我们养成了将组件方法和属性标记为私有的习惯。在Angular 6中,在构建库时(转换并使用新的库CLI功能后),我们得到:

实际上,html模板中使用的任何属性或方法都不能再在组件类上标记为private。当然,我们可以通过删除“private”修饰符来解决这个问题。在angular 5中,当我们使用

奇怪的是,这只发生在编译我们的库时。我们将一个应用升级到angular 6,它在模板中的组件/用法上也有私有属性和方法,并且没有问题


我们找到虫子了吗?是否有我们不遵守的最佳实践?

模板中使用的属性必须是公共的-这与AoT编译有关


(在那里找到“public”一词)

在Angular中,我们有两种编译模式

  • JIT-即时编译:JIT编译顾名思义,在浏览器中即时编译应用程序 运行时。

  • AoT-提前编译:AoT编译在构建时编译应用程序

默认情况下,通过开发构建,即
ngserve
我们得到了JIT编译。这就是它的工作原理。应用程序代码和角度编译器由浏览器下载。在运行时,当向应用程序发出请求时,浏览器中的JIT编译器会在执行应用程序代码之前对其进行编译

使用生产构建,即
ng build--prod
我们得到AoT编译,角度应用程序是预编译的。因此,这意味着浏览器加载可执行代码,以便能够立即呈现应用程序,而无需等待首先编译应用程序

TypeScript
public
不重要,但
private
重要

来自角度文档
所有属性都必须是TypeScript public 财产。Angular从不绑定到TypeScript私有属性。

实际上,它确实绑定到
私有属性
属性,但不在
AoT模式下


使用JIT,我们将所有代码转换为ES5,然后在运行时进行绑定。在这个过程中,所有的可见性修饰符都会丢失,因此,如果您为此而说
public
private
,这并不重要


另一方面,使用AoT,我们为模板生成一些typescript代码,这些代码将尝试访问这些字段。如果它们是
private
,它们就无法访问这些属性,因此,您需要将它们设置为
public

,因为AOT编译需要将其设置为public
Property 'getCurrentYear' is private and only accessible within class.