将 @ViewChild 标记为私有的是否可行?

8

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

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

@ViewChild(HelloComponent) private helloComponent;

这是我所说的stackblitz:
https://stackblitz.com/edit/angular-vxbpuk?file=src%2Fapp%2Fapp.component.ts 我认为这个stackblitz使用了aot,但你可以在本地验证相同的事情。
编辑:我之前没有提到,但是有这篇来自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 字段不行 -- 请参见 https://github.com/microsoft/TypeScript/issues/31670,了解为什么他们保留了两者的大讨论。 - Coderer
4个回答

4

看起来是可以的,因为您可以在官方的Angular基础指南中找到相应的内容:

组件和模板 > 组件交互 > 父组件调用 @ViewChild():

@ViewChild(CountdownTimerComponent) private timerComponent: CountdownTimerComponent;


抱歉之前没有提到,但是文档中的这段话让我感到担忧:https://angular.io/guide/aot-compiler#phase-2-code-generation - NullTerminator
我明白你的意思,但我也不知道哪一个是正确的。我建议你查看一下GitHub上关于这个问题的讨论,并在angular仓库中提出一个问题。如果你这样做了,请告诉我们结果。 - GCSDC
2
仍在等待此问题的结果:https://github.com/angular/angular/issues/27467 - NullTerminator

1

是的,这样做是可以的。由于此变量作用域仅限于 component 类,我们可以将其声明为 private 并使用。

@ViewChild 用于在 component 内部与子 component 交互,因此我们可以将其保持为 private


1
privatepublic语法是javascript语言的增强功能,用于typescript中的“静态分析” 编译器。我建议您尝试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;
  }

}

0

这是一种语法糖,你可以使用 TypeScript 来确保减少错误并防止它们,但最终在编译代码后,所有内容都会被转换回 JavaScript。如果你在当前类中仅使用此变量,则使用 private 关键字是可以的,但如果你在构建项目和部署时访问其他类中的此变量,则会出现错误。

在 JavaScript 中,没有私有或公共的概念,一切都是闭包作用域。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接