我们将从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,该模型在模板中的组件/用法上也有私有属性和方法,并且没有问题。
我们找到了错误吗?我们不遵守最佳做法吗?
答案 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 mode
或public
说出来,则无关紧要。
另一方面,使用AoT,我们为模板生成一些打字稿代码,这些代码将尝试访问这些字段。如果它们是private
,则它们无法访问这些属性,因此,您需要将它们设置为private
。
答案 1 :(得分:2)
在模板中使用的Properites必须是公共的 - 这与AoT编译有关。
https://angular.io/guide/aot-compiler(在那里找到“公开”字样)