可以将@ViewChild 标记为私有吗?

Posted

技术标签:

【中文标题】可以将@ViewChild 标记为私有吗?【英文标题】:Is it okay to mark a @ViewChild as private? 【发布时间】:2019-05-06 07:46:55 【问题描述】:

如果模板中没有引用 ViewChild,是否可以将其标记为私有?

我已经能够做到这一点,然后使用“--prod”标志构建和服务,并且没有遇到任何错误。我目前正在使用 Angular 7。

@ViewChild(HelloComponent) private helloComponent;

这是我正在谈论的内容的堆栈闪电:https://stackblitz.com/edit/angular-vxbpuk?file=src%2Fapp%2Fapp.component.ts

认为我有使用 aot 的 stackblitz,但您可以在本地验证同样的事情。

编辑:对于之前没有提出这个问题,我深表歉意,但是 Angular 文档中的这个简介让我停下来:

https://angular.io/guide/aot-compiler#phase-2-code-generation

装饰的组件类成员必须是公共的。您不能将 @Input() 属性设为私有或内部。

但正如@GCSDC 在下面已经指出的那样,Angular 团队似乎在他们的示例中使用了私有成员:https://angular.io/guide/component-interaction#parent-calls-an-viewchild

【问题讨论】:

这可能值得区分,private 可以,但 ES 类 #private 字段则不行——请参阅github.com/microsoft/TypeScript/issues/31670 了解他们为什么同时保留这两个字段的大讨论 【参考方案1】:

似乎是的,这没关系,因为您可能会发现它也在官方 Angular 基础指南中完成,网址为:

组件和模板 > 组件交互 > Parent calls an @ViewChild():

@ViewChild(CountdownTimerComponent) 私有计时器组件:CountdownTimerComponent;

【讨论】:

抱歉之前没有提到这一点,但文档中的这个简介让我很担心:angular.io/guide/aot-compiler#phase-2-code-generation 我明白你的意思,但我也不知道你认为哪一个是正确的。我建议您检查有关此的任何 GitHub 讨论,并可能在 angular repo 上提出有关此的问题。如果您这样做,请告诉我们结果。 还在等待这个问题的结果:github.com/angular/angular/issues/27467【参考方案2】:

privatepublic 语法是对 javascript 语言在 typescript transpiler 中“静态分析”的增强,我建议您尝试 playground 如何将 typescript 转换为 JS。所以基本上它是让任何阅读代码的人了解变量/函数的范围的一种方式。 类中的一个简单变量的示例是它们都转换为相同的 JS private var1: number = 0public var1: number = 0 都转换为 this.var1 = 0

但是!在某些情况下,您实际上希望从父组件访问@ViewChild,但在这种情况下,您必须将其设置为@ViewChild(HelloComponent) public helloComponent;,否则您将收到“编译/转译”错误。如果您想更清楚地了解范围的位置,请将其保留为 private,而是像这样使用 getter/setter:

export class MyComponent 

  @ViewChild(HelloComponent) private _helloComponent;

  get helloComponent(): any 
    return _helloComponent;
  

  set helloComponent(set: any) 
    this._helloComponent = set;
  


【讨论】:

【参考方案3】:

是的,可以这样做。由于这个变量范围仅限于component类,我们可以声明它private并使用。

@ViewChild 用于在component 内部与子component 进行交互,因此我们可以保留它private

【讨论】:

【参考方案4】:

这是你使用打字稿的语法糖,只是确保有更少的错误并防止它们,但最终所有在编译代码之后都转译回 javascript。如果你只在当前类中使用这个变量,那么你如何使用上面的private 关键字会很好,但是如果你在构建项目和部署的其他类中访问这个变量,你会得到错误。

在 javascript 中没有私有或公有的一切都是闭包范围的。

【讨论】:

以上是关于可以将@ViewChild 标记为私有吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 c# 中将一组成员标记为私有/公共

我可以将我的网站资源设为私有吗?

我可以将复制构造函数设为私有并仍然使用默认实现吗

我们可以将装饰对象的实例设为私有而不是在抽象装饰器中保护吗?

java中私有的属性、静态成员可以被子类继承吗?

如果我们将Optional.of方法设为私有,并且只允许Java中的Optional.ofNullable,该怎么办?除了向后兼容性会有什么问题吗?