2
votes

Utilisation correcte du constructeur Angular TypeScript - Impossible de résoudre tous les paramètres pour

constructor(private anotherService?: MyAnotherService) {
        // doThings with anotherService
      }

6 commentaires

pourquoi passez-vous 'private someInteger?: number'


C'est l'une des configurations que j'aimerais avoir à disposition lors de la phase de construction, rien que ça. N'est-ce pas normal dans Typescript d'avoir ce genre de constructeur?


Le constructeur doit généralement être utilisé uniquement pour l'injection de dépendances


Avez-vous besoin que ce service soit déclaré en tant que fournisseur tree-shakable ?


Comment créez-vous une instance de ce service? Laissez-vous toujours la DI angulaire le faire? Alors, comment fournissez-vous le paramètre entier?


@David J'ai ajouté la modification pour clarifier pourquoi je voudrais que le service soit créé avec ou sans la relation avec Angular


5 Réponses :


0
votes

supprimez simplement le '?'

myVariable: any;
constructor(private anotherService: MyAnotherService) {

this.myVariable = [];
}

ou pour les paramètres:

import {MyAnotherService} from '/pathto your service';
     constructor(private anotherService: MyAnotherService) {
           //prodedures
          }


0 commentaires

0
votes

Le constructeur doit généralement être utilisé uniquement pour l'injection de dépendances

 <my-component [state]="'joining'"></my-component>

    export class MyService{
  state: string;
      constructor() { 
        console.log(this.state) // => undefined
      }
      ngOnInit() {
        console.log(this.state) // => 'joining'
      }
    }


3 commentaires

Vous pouvez voir dans ce cas, j'essaye de construire un service, @ Input decorator doit être utilisé avec @ Component uniquement. Ai-je raison?


peut envoyer ---> stackoverflow .com / questions / 51027711 /…


vous pouvez l'utiliser comme modèle ou variable



1
votes

2
votes

La pratique courante est d'y mettre aussi peu de logique que possible. La plupart du temps, le constructeur est utilisé pour injecter des dépendances.

ngOnInit() {
   this.anotherService.getValue().subscribe((value) => {
      // do something
   });
}

puis l'utiliser dans d'autres fonctions

constructor(private anotherService: AnotherService) {
    // **don't** do Things with anotherService
  }

La fonction ngOnInit () sera appelé lorsque le DOM du composant a été créé, toutes les dépendances ont été injectées et toutes les entrées ont été liées. Il est courant d'utiliser ngOnInit () même si la logique ne dépend pas du DOM, de la liaison d'entrée ou de l'injection Dependencie.


0 commentaires

2
votes

Vous pouvez utiliser un jeton d'injection facultatif

token.ts

import {INTEGER_TOKEN} from './token';

import {Injectable, Inject, Optional} from '@angular/core';


@Injectable({
  providedIn: 'root',

})
export class MyService{

  constructor(@Optional() @Inject(INTEGER_TOKEN) private someInteger?: number) {
    // doThings with someInteger
  }

app.module.ts

import {INTEGER_TOKEN} from './token';

@NgModule({
//...
  ],
  providers: [
    {
      provide: INTEGER_TOKEN,
      useValue: 1 //Or factory if you need one
    },

import {InjectionToken} from '@angular/core';

export const INTEGER_TOKEN= new InjectionToken<number>('IntegerToken');


0 commentaires