[英]It feels like there's a third scope (besides public and private) in Angular but there isn't
到目前为止,我可以阅读文档,在TypeScript中只有public
和private
作为范围。 但是,当我尝试以下练习时,我会得到不同的结果,就好像变量environment
对标记不可见,除非声明(公开或私下)。
<div class="text-section">
Name is: {{environment.shazoo}}.
</div>
import { environment } from "../../../../environments/environment";
...
@Component({ ... })
export class DemoComponent implements OnInit {
constructor(private builder: FormBuilder) { ... }
...
private environment = environment;
}
上面的例子导致显示hazaa文本。 但是,如果我注释掉将导入的环境实例分配给本地声明的实例,则文本将消失。
import { environment } from "../../../../environments/environment";
...
@Component({ ... })
export class DemoComponent implements OnInit {
constructor(private builder: FormBuilder) { ... }
...
// private environment = environment;
}
我的方式是,如果导入的实例在代码中可见但在标记中不可见,则存在第三级范围,无论可能是什么(某种隐蔽的私有东西)。 但我几乎认为现实情况并非如此。 我错过了什么?
您似乎将TypeScript可见性与JavaScript上下文和变量作用域混淆。
private
和public
是访问修饰符 ,只影响编译阶段的类型检查,并且是可选的(除了它们用作构造函数的情况,它们也隐式地将参数指定为类属性)。
private environment = ...
背后的含义private environment = ...
是this.environment = ...
发生在引擎盖下的构造函数中。 您可以签入转换后的代码
export class DemoComponent implements OnInit {
...
environment = environment;
}
结果在this.environment = environment
( public
访问修饰符在这里是可选的)。
在另一个地方(编译模板)中不可能使用导入的environment
变量(它是导入它的组件模块的本地变量),除非它可用于应该使用的地方(模板编译器),例如通过分配它到它有权访问的东西(类属性)。 这是由JavaScript的工作方式建议的,并不是特定于Angular或TypeScript。
{{environment}}
实际上意味着正在从组件类实例中读取environment
属性。 由于模板语法是由Angular编译器定义的DSL, this
可以在那里使用,但为简洁起见, this
是可选的:
{{environment === this.environment}} is true
最后,模板中使用的所有组件属性都应该是公共的,即不应具有private
或protected
访问修饰符。 这是Angular AoT编译所必需的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.