【问题标题】:Angular 6 private methodsAngular 6 私有方法
【发布时间】:2018-05-15 15:44:03
【问题描述】:

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

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

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

奇怪的是,这只发生在编译我们的库时。我们将应用升级到 Angular 6,该应用在组件/模板中的使用方面也具有私有属性和方法,并且没有任何问题。

我们发现错误了吗?有没有我们没有遵守的最佳做法?

【问题讨论】:

  • 由于AOT编译需要公开

标签: angular shared-libraries private


【解决方案1】:

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

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

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

默认情况下,使用开发版本,即ng serve,我们会得到 JIT 编译。这就是它的工作原理。应用程序代码与 Angular 编译器一起由浏览器下载。在运行时,当向应用程序发出请求时,浏览器中的 JIT 编译器会在应用程序代码执行之前对其进行编译。

使用生产版本,即ng build --prod,我们得到 AoT 编译,Angular 应用程序是预编译的。所以这意味着浏览器会加载可执行代码,因此它可以立即渲染应用程序,而无需等待首先编译应用程序。

TypeScript public 不重要,但 private 重要

来自 Angular 文档
所有 data bound 属性必须是 TypeScript public 特性。 Angular 从不绑定到 TypeScript 私有属性。

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

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

使用 JIT,我们将所有代码转换为 ES5,然后在运行时进行绑定。在该过程中,所有可见性修饰符都会丢失,因此您说publicprivate 都没关系。

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

【讨论】:

    【解决方案2】:

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

    https://angular.io/guide/aot-compiler(在那里找到“public”这个词)

    【讨论】:

      猜你喜欢
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 2015-10-09
      相关资源
      最近更新 更多