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

时间:2018-12-04 19:54:02

标签: angular private angular7 viewchild angular-aot

如果未在模板中引用ViewChild,可以将其标记为私有吗?

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

@ViewChild(HelloComponent) private helloComponent;

以下是我所谈论的内容:
https://stackblitz.com/edit/angular-vxbpuk?file=src%2Fapp%2Fapp.component.ts

思考我使用aot进行了堆栈闪电射击,但是您可以在本地验证同一件事。

编辑:对于之前没有提出来,我深表歉意,但是有角文档中的这句话让我停下来了:

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

  
    

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

  

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

4 个答案:

答案 0 :(得分:1)

似乎可以,这是可以的,因为您可能会在官方的角度基础知识指南中找到它,方法是:

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

  

@ViewChild(CountdownTimerComponent)     私人timerComponent:CountdownTimerComponent;

答案 1 :(得分:1)

是的,这样做是可以的。由于此变量作用域仅限于组件类,因此我们可以将其声明为私有和使用。

@ViewChild用于在组件内部与子组件进行交互,因此我们可以将其设为私有。

答案 2 :(得分:0)

privatepublic语法是对打字稿transpiler中“静态分析”的javascript语言的增强,我建议您尝试使用playground打字稿转换为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 :(得分:0)

这是语法糖,您使用Typescript只是要确保有较少的错误并防止出现这些错误,但最终在编译代码转译回javascript之后。如果您仅在当前类中使用此变量,则如何在上面使用private关键字,这很好,但是如果在构建项目时在其他类中访问此变量并进行部署,则会出错。

在javascript中,没有任何私有或公共的东西都以闭包为范围。