可以将@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】:private
和 public
语法是对 javascript 语言在 typescript transpiler 中“静态分析”的增强,我建议您尝试 playground 如何将 typescript 转换为 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】:是的,可以这样做。由于这个变量范围仅限于component
类,我们可以声明它private
并使用。
@ViewChild
用于在component
内部与子component
进行交互,因此我们可以保留它private
。
【讨论】:
【参考方案4】:这是你使用打字稿的语法糖,只是确保有更少的错误并防止它们,但最终所有在编译代码之后都转译回 javascript。如果你只在当前类中使用这个变量,那么你如何使用上面的private
关键字会很好,但是如果你在构建项目和部署的其他类中访问这个变量,你会得到错误。
在 javascript 中没有私有或公有的一切都是闭包范围的。
【讨论】:
以上是关于可以将@ViewChild 标记为私有吗?的主要内容,如果未能解决你的问题,请参考以下文章
我们可以将装饰对象的实例设为私有而不是在抽象装饰器中保护吗?
如果我们将Optional.of方法设为私有,并且只允许Java中的Optional.ofNullable,该怎么办?除了向后兼容性会有什么问题吗?