我注意到,如果没有使用显式范围定义注入,角度类将无法识别注入的服务。
以下代码不起作用
constructor(router: Router) {}
但是这个可以。
constructor(private router: Router) {}
谁能解释一下为什么?我相信,如果您没有显式编写属性的范围定义,那么默认情况下它是公共的,就像类属性一样,但似乎不是这里的情况。
您在构造函数中定义的任何内容都将被视为参数。这是一个
TypeScript
的便利,您可以将访问器附加到它上面。例如:
constructor(private router: Router) {}
是ES6的简写:
constructor(router) {
this.router = router;
}
如果您执行以下操作,依赖注入仍然有效:
constructor(router: Router) {
// router only available in this scope
}
只是它仅在构造函数内部可用,而不是在类实例中可用,因为它在构造函数
{}
范围内。类字段是在类{}
范围内定义的,因此可以在整个类中访问
第一个只是一个参数。第二个是 also 声明并设置私有字段的参数。 (
public router: Router
将是 also 声明并设置公共字段的参数。)DI 期望实例将保留在实例上注入的内容。
在 Angular 的构造函数参数中使用私有变量是一种促进封装的约定,利用 TypeScript 的自动属性初始化,并与 Angular 的依赖注入系统保持一致。它有助于打造更干净、更易于维护的代码库。