mettre à jour Angular4
Dans Angular4 OpaqueToken
est obsolète et sera remplacé par InjectionToken
. InjectionToken permet de passer un paramètre de type générique.
export let APP_CONFIG = new InjectionToken<MyConfig>("app.config");
Voir aussi
original
Qu'est-ce que c'est ? Qu'est-ce qu'un jeton Angular2 pour commencer ?
Qu'est-ce qu'un jeton opaque ? À quoi sert-il ?
Un token est une clé pour les fournisseurs de l'injection de dépendance Angulars. Les fournisseurs sont enregistrés avec une clé et les composants, directives et classes de service instanciés par DI reçoivent des dépendances injectées qui sont recherchées par les clés des fournisseurs.
DI prend en charge les types, les chaînes de caractères, OpaqueToken
et des objets comme clés.
export let APP_CONFIG = new OpaqueToken("app.config");
export let APP_CONFIG_2 = {};
providers: [
MyService, // type is key and value
{provide: MyService, useClass: MyFancyServiceImpl}, // type is key, `MyFancyServiceImpl` is the value (or rather the information how to create the value
{provide: 'myservice', useClass: MyService}, // key is a string
{provide: APP_CONFIG, useValue: {a: 'a', b: 'b'}} // key is an `OpaqueToken`
{provide: APP_CONFIG_2, useValue: {a: 'a', b: 'b'}} // key is an object
]
// one of these decorators needs to be added to make DI work
@Injectable()
@Component()
@Directive()
@Pipe()
class MyComponent {
// DI looks up a provider registered with the key `MyService`
constructor(private myService: MyService) {}
// Same as before but explicit
constructor(@Inject(MyService) private myService: MyService) {}
// DI looks up a provider registered with the key 'myService'
constructor(@Inject('myservice') private myService: MyService) {}
// DI looks up a provider registered with the `OpaqueKey` `APP_CONFIG`
constructor(@Inject(APP_CONFIG) private myConfig: any) {}
// DI looks up a provider registered with the object `APP_CONFIG_2`
constructor(@Inject(APP_CONFIG_2) private myConfig: any) {}
La clé de l'objet ( APP_CONFIG_2
) et le OpaqueToken
( APP_CONFIG
) doivent être exactement la même instance. Une instance différente avec le même contenu ne fonctionnera pas. Il est ainsi facile de savoir où la clé est déclarée et si le fournisseur et la cible d'injection utilisent la même clé.
Pour une chaîne, il peut s'agir d'une instance différente, ce qui présente le risque que la même valeur de chaîne soit utilisée dans différents modules et puisse entraîner des conflits ou l'injection du mauvais fournisseur.
0 votes
Pourquoi cela n'a-t-il pas aidé ? C'est exactement à cela qu'ils servent.
0 votes
Je ne comprends pas du tout ce qu'est un "jeton" dans ce contexte.
0 votes
"Éléments d'entrée autres que les espaces blancs et les commentaires... mots réservés, identificateurs, littéraux et ponctuateurs..." - ariya.io/2012/07/most-popular-javascript-tokens . Voici un bon exemple d'utilisation d'un
OpaqueToken
; injecter leLOCALE_ID
: stackoverflow.com/a/39344889/30017610 votes
Oui, plus ou moins. S'ils avaient simplement fait
export const LOCALE_ID = 'localeId';
ou quelque chose comme ça, il n'y aurait aucun moyen pour l'ID de la distinguer de la même constante ailleurs.3 votes
Le terme "jeton" est un synonyme d'"identifiant". Et
OpaqueToken
est une alternative spécifique à A2 àSymbol
. Si vous savez ce queSymbol
est pour, vous connaissez déjà l'affaire.0 votes
Y a-t-il une raison pratique pour cette alternative spécifique à A2, ou obtient-on le même résultat en exportant un vieux symbole ES6 ? (J'essaie maintenant...)
1 votes
Je ne vois pas de raison de ne pas importer un fichier constants.ts et d'en finir.
0 votes
@VSO Je suis vraiment curieux - y a-t-il une raison pour laquelle vous avez estimé que la réponse de Gunter n'était pas "digne d'être vérifiée" ? Quelque chose vous a semblé manquer ?
1 votes
@ruffin Pour être honnête, je ne m'en souviens plus. Je reviendrai pour en faire le bilan. En général, je vérifie les réponses, donc je suppose qu'il y avait une raison. P.S. Gunter est un expert génial, donc je suis sûr qu'il a raison. Je reviendrai sur ce point.