typescript - Varför behöver Angulars beroendeinjektion private eller public för att fungera?


Jag har märkt att en Angular-klass inte känner igen en injicerad tjänst om den inte har injicerats med en uttrycklig scope-definition.

Den här koden fungerar inte

constructor(router: Router) {}

men denna gör det.

constructor(private router: Router) {}

Kan någon förklara varför? Jag tror att om du inte uttryckligen skriver egenskapens scopesdefinition, så är den offentlig som standard, precis som klassers egenskaper, men det verkar inte vara fallet här.

Svar #1

Vad du än definierar i din konstruktor tas som en parameter. Det är en TypeScript bekvämlighet att du kan fästa en åtkomstmetod till den. Till exempel:

constructor(private router: Router) {}

är en förkortning för ES6:

constructor(router) {
  this.router = router;
}

Dependency injection fungerar fortfarande, om du gör följande:

constructor(router: Router) {
  // router only available in this scope
}

Det är bara det att det bara är tillgängligt inne i konstruktorn och inte i klassinstansen, eftersom det är inne i konstruktorns {} omfång. Ett klassfält definieras i klassens {} omfång och är därför åtkomligt i hela klassen

Svar #2

Det första är bara en parameter. Den andra är en parameter som också deklarerar och sätter ett privat fält. (public router: Router skulle vara en parameter som också deklarerar och sätter ett publikt fält.) DI förväntar sig att instansen kommer att behålla det som injiceras på instansen.

Relaterade artiklar