Maison > interface Web > js tutoriel > La différence entre ViewProviders et Providers dans Angular

La différence entre ViewProviders et Providers dans Angular

php中世界最好的语言
Libérer: 2018-03-19 16:52:22
original
4303 Les gens l'ont consulté

Cette fois, je vais vous présenter la différence entre ViewProviders et Providers dans Angular. Quelles sont les précautions lors de l'utilisation de ViewProviders et Providers dans Angular. Voici des cas pratiques, jetons un coup d'œil.

Lors de l'utilisation de l'Injection de dépendances (DI) dans Angular, nous utilisons généralement providers. En fait, nous avons une autre option pour faire la même chose : viewProviders.

viewProviders nous permet de définir des fournisseurs qui ne sont visibles que par la vue du composant. Ci-dessous, nous utilisons des exemples pour illustrer ce point en détail.
Supposons que nous ayons un service simple :

// myService.service.ts
import { Injectable } from '@angular/core';
@Injectable()
export class MyService{
  testIfGetService(where){
    console.log('Got My Service in ' + where);
  }
}
Copier après la connexion

Ce service est très simple, il suffit d'imprimer l'endroit où le service est appelé.
Ensuite il y a un composant enfant, qui sert à se projeter dans le composant parent (vous le verrez plus tard) :

// child.component.ts
import { Component } from '@angular/core';
import { MyService } from './myService.service';
@Component({
  selector: 'vp-child',
  template: `
    <p>This is child!!!</p>
  `
})
export class VPChild{
  constructor(
    private service: MyService
  ){
    this.service.testIfGetService('child');
  }
}
Copier après la connexion

Ce composant injecte le MyService service et appelle MyService testIfGetService méthode, et passer child indique qu'elle est appelée dans le composant enfant.
Il existe un autre sous-composant, qui sert à être placé dans le modèle du composant parent :

// viewChild.component.ts
import { Component } from '@angular/core';
import { MyService } from './myService.service';
@Component({
  selector: 'vp-viewchild',
  template: `
    <p>This is viewChild!!!</p>
  `
})
export class ViewVPChild{
  constructor(
    private service: MyService
  ){
    this.service.testIfGetService('viewChild');
  }
}
Copier après la connexion

Ici, nous injectons également le service MyService et appelons le service MyService testIfGetService méthode et passez en viewChild.
Enfin, le composant parent :

// parent.component.ts
import { Component } from '@angular/core';
import { MyService } from './myService.service';
@Component({
  selector: 'vp-parent',
  template: `
    <p>This is parent!!!</p>
    <ng-content></ng-content>
    <vp-viewchild></vp-viewchild>
  `,
  providers: [MyService]
})
export class VPParent{
  constructor(
    private service: MyService
  ){
    this.service.testIfGetService('parent');
  }
}
Copier après la connexion

Dans le composant parent, inscrivez providers auprès de MyService, puis appelez MyService de testIfGetService en passant parent.
Utilisez ensuite le composant parent comme ceci :

<vp-parent>
  <vp-child></vp-child>
</vp-parent>
Copier après la connexion
Copier après la connexion

Exécutez le programme et la console affiche le résultat :
La différence entre ViewProviders et Providers dans Angular

Tout est comme prévu ! !
Ensuite, nous utilisons viewProviders au lieu de providers pour enregistrer MyService et voir ce qui se passe :

// parent.component.ts
import { Component } from '@angular/core';
import { MyService } from './myService.service';
@Component({
  selector: 'vp-parent',
  template: `
    <p>This is parent!!!</p>
    <ng-content></ng-content>
    <vp-viewchild></vp-viewchild>
  `,
  viewProviders: [MyService] // <---
})
export class VPParent{
  constructor(
    private service: MyService
  ){
    this.service.testIfGetService('parent');
  }
}
Copier après la connexion

Après avoir modifié comme ceci, nous exécutons le programme et constatons qu'une erreur est signalée :
La différence entre ViewProviders et Providers dans Angular

Si vous commentez contentChild, comme ceci :

<vp-parent>
  <!-- <vp-child></vp-child> -->
</vp-parent>
Copier après la connexion

, aucune erreur ne sera signalée :
La différence entre ViewProviders et Providers dans Angular

Cela signifie que le fournisseur enregistré avec viewProviders dans le composant parent n'est pas visible par contentChildren. Le fournisseur enregistré à l'aide de providers est visible à la fois par viewChildren et contentChildren !
Explication supplémentaire : le composant recherchera le fournisseur étape par étape jusqu'à ce qu'il soit trouvé, sinon une erreur sera générée. Comme ici :

<vp-parent>
  <vp-child></vp-child>
</vp-parent>
Copier après la connexion
Copier après la connexion

vp-child a recherché le fournisseur de MyService et l'a trouvé dans vp-parent. Mais lors de l'utilisation de viewProviders, vp-child a recherché, c'est-à-dire vp-parent, mais je ne l'ai pas trouvé. Ensuite, j'ai cherché le parent de vp-parent et je ne l'ai toujours pas trouvé (car dans cet exemple. , nous n'avons enregistré que vp-parent dans MyService), puis avons continué à chercher vers le haut... La limite n'a pas été trouvée, donc une erreur a été générée. Si vous ne le souhaitez pas, vous pouvez utiliser @Host pour effectuer des restrictions, comme ceci :

constructor(
    @Host() private service: MyService
){}
Copier après la connexion

Cet article ne s'étendra pas sur @Host(). Si vous êtes intéressé, vous pouvez le rechercher sur Google. toi-même.

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php !

Lecture recommandée :

Liaison d'entrée du formulaire Vue.js

Quels sont les composants de définition de classe dans React

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal