Angular 6私有方法

时间:2018-05-15 15:44:04

标签: angular shared-libraries private

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

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

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

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

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

2 个答案:

答案 0 :(得分:21)

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

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

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

默认情况下,使用开发构建即$zmcats = "select i.ename as iname,c.ename as cname, c.id as cid from items i inner join categories c on c.id = i.cat_id where i.view > 4 and c.id = i.cat_id and c.status = 1 group by c.id"; $zmcat = $dba->query($zmcats); while ($zzmcat = $zmcat->fetch_array(MYSQLI_ASSOC)){ ?> <li class="category-list list-parent"><a href="#"><?php echo $zcatzn["cname"]; ?></a> <ul class="list-child"> <?php $q = "SELECT id, ename FROM items WHERE view > 4 and status = 1 and cat_id='$zcatzn[cid]'"; $qq = $dba->query($q); while ($product = $qq->fetch_array(MYSQLI_ASSOC)) { ?> <li class="category-list"><a href="#"> <?php echo $product['ename']; ?> </a></li> <?php } ?> </ul> </li> <?php } ?> ,我们可以获得JIT编译。这是它的工作原理。浏览器下载应用程序代码和角度编译器。在运行时,当向应用程序发出请求时,浏览器中的JIT编译器会在应用程序代码执行之前编译它。

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

TypeScript ng build --prod并不重要,public可以

  

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

实际上,它确实绑定到private属性,但未绑定到private

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

使用JIT,我们将所有代码转换为ES5,然后在运行时,我们进行绑定。所有可见性修饰符都会在该过程中丢失,因此,如果您为此AoT modepublic说出来,则无关紧要。

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

答案 1 :(得分:2)

在模板中使用的Properites必须是公共的 - 这与AoT编译有关。

https://angular.io/guide/aot-compiler(在那里找到“公开”字样)