如果未在模板中引用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
答案 0 :(得分:1)
似乎可以,这是可以的,因为您可能会在官方的角度基础知识指南中找到它,方法是:
组件和模板>组件交互> Parent calls an @ViewChild():
@ViewChild(CountdownTimerComponent) 私人timerComponent:CountdownTimerComponent;
答案 1 :(得分:1)
是的,这样做是可以的。由于此变量作用域仅限于组件类,因此我们可以将其声明为私有和使用。
@ViewChild
用于在组件内部与子组件进行交互,因此我们可以将其设为私有。
答案 2 :(得分:0)
private
和public
语法是对打字稿transpiler中“静态分析”的javascript语言的增强,我建议您尝试使用playground打字稿转换为JS。因此,基本上,这是任何阅读代码的人都可以了解变量/函数范围的方式。
类内部的简单变量的示例是,它们都被转换为相同的JS private var1: number = 0
和public 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中,没有任何私有或公共的东西都以闭包为范围。