Angular 6个私有方法

Angular 6 private methods

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

Property 'getCurrentYear' is private and only accessible within class.

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

生成库时,angular 5 中的情况并非如此

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

我们发现错误了吗?是否有我们没有遵循的最佳实践?

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

https://angular.io/guide/aot-compiler(在那里找到单词 "public")

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

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

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

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

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

TypeScript public 无关紧要,但 private 重要

From Angular Docs
All properties must be TypeScript public properties. Angular never binds to a TypeScript private property.

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

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

使用 JIT,我们将所有代码转换为 ES5,然后在运行时进行绑定。所有可见性修饰符都在该过程中丢失,因此您为此选择 publicprivate 并不重要。

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