Angular组件中的“私有”和“公共”


120

如果我没有在,和之前添加private,则我认为它们默认是公开的。fooloadBartext

export class RandomComponent {
  @Input() foo: string;
  @Output() loadBar = new EventEmitter();
  text: string;
}

当它们public在组件中时,是否有任何用例?

出于封装/安全性的原因,我是否应该总是private像下面这样为它们全部添加?

export class RandomComponent {
  @Input() private foo: string;
  @Output() private loadBar = new EventEmitter();
  private text: string;
}

谢谢


简单来说,私有功能只能在组件中使用。无法从其他组件访问私有功能。假设在服务中,如果一个函数声明为Private,则不能从任何其他组件访问它。
凯文

Answers:


201

对于这个问题,有很多要说的话,这些是我想到的第一个想法:

首先,请记住,这private只是一个编译时构造-不能在运行时强制执行(有关讨论请参见此处此处)。因此,请不要滥用private任何出于安全目的有用的概念。这根本不是问题所在。

关于封装,而当你有你的组件上的字段或方法要在它封装,这就很清楚,它不应该从其他地方进行访问,那么你绝对应该让它private:这就是private是:这表明您的意图是,无论您在课堂上穿什么,都不应在课外被触及。

同样的道理public:它也是仅编译时的构造,因此public默认情况下类成员为true的事实在运行时的含义为零。但是,当您有一个成员明确打算将其作为类的API的一部分公开给外界时,您应该绝对使其public发出信号以表明这一意图:这就是public目的。

通常,这全部适用于Typescript。具体来说,在Angular中,在组件类上具有公共成员肯定是有效的用例:例如,在实现容器/组件(又名smart / dumb)模式时,“笨拙”的子代通过构造函数注入注入“聪明”的父代,传达您的意向,告知孩子们应该和不应该触摸父母的哪些成员是非常重要的:否则,当您发现那些愚蠢的孩子在父母的酒柜里四处游荡时,不要感到惊讶。

因此,我对您的问题的回答:

我应该总是像下面这样为所有这些人都添加私人身份吗?

是强调。您不应该总是添加,private因为这样做会破坏关键字的目的,因为如果将其放在任何地方都不再表示任何意图:您最好也不要将其放置在任何地方。


5
感谢您的解释。但是,也许我弄错了:我知道大多数时候属性和方法必须是私有的(=“仅用于此组件”)。因此答案应该是“默认情况下是,只要家伙不需要将属性/方法暴露在外面”。不是吗 为什么通过回答“否”(听起来像“从不”)来结束您的解释?
M'sieur Toph'17

1
我用了红色的angular 2教程,但我不知道何时应该使用public。组件通信有很多变体:angular.io/docs/ts/latest/cookbook / ...也许我们应该只对通过输入输出定义的属性和方法使用public。但是我不确定。
Ruslan Borovok

当我在构造函数中声明一个在类内部未使用但在外部(即在模板或其他组件内部)使用的属性时,通常必须使用“ public”。
tuliomarchetto

18

@drewmoore提供了一个很好的答案,因为私人/公共可以归结为意图。但是,使用注入的私有值时,还需要考虑以下几点:

如果我们要发出TypeScript作为AoT编译过程的输出,则必须确保仅访问组件模板中的公共字段**


关于您的第一点:这些错误与私人或公共成员无关,它们只是表明未使用成员。如果问题是关于引用模板中的私有成员的那么后两点将是有效的,但事实并非如此。看到这里的问题是
drew moore

@drewmoore,您是正确的,而且我了解他们表示未使用它们。但是,公共变量可以在外部使用,因此永远不会触发该警告。关于问题本身“在组件中公开时有用例吗?”,我相信我的第二点和第三点至少表明了它们在公开时的用例,特别是当您想在模板中使用它们时。 (如引用的文字所示)。
卢卡斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.