Angular 6私有方法

Sco*_*ott 9 private shared-libraries angular

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

Property 'getCurrentYear' is private and only accessible within class.
Run Code Online (Sandbox Code Playgroud)

实际上,模板html中使用的任何属性或方法都不能在组件类上标记为私有.当然,我们可以通过删除'private'修饰符来解决这个问题.当我们使用https://github.com/raphael-volt/ng2-testable-lib生成我们的库时,在角度5中不是这种情况.

奇怪的是,只有在编译我们的库时才会发生这种情况.我们将应用程序升级到角度6,该模型还具有模板中组件/用法的私有属性和方法,并且没有问题.

我们找到了错误吗?有没有我们不遵守的最佳做法?

Vik*_*kas 20

在Angular中,我们有2个编译模型

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

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

默认情况下,使用开发构建即ng serve我们获得JIT编译.这是它的工作原理.浏览器下载应用程序代码和角度编译器.在运行时,当向应用程序发出请求时,浏览器中的JIT编译器在执行之前编译应用程序代码.

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

TypeScript public并不重要,但private确实如此

来自Angular Docs
所有data bound属性都必须是TypeScript公共属性.Angular永远不会绑定到TypeScript私有属性.

实际上,它确实绑定到private属性,但不绑定AoT mode

Why AOT Compiler requires public properties, while non-AOT allows private properties?

使用JIT,我们将所有代码转换为ES5,然后在运行时,我们进行绑定.所有可见性修饰符都在该过程中丢失,因此无论您是说public还是private为此都无关紧要.

另一方面,使用AoT,我们为模板生成一些打字稿代码,这些代码将尝试访问这些字段.如果是private,他们根本无法访问这些属性,因此,您需要将它们作为public.