Je vois beaucoup de problèmes similaires ici, mais je n'ai pas encore trouvé une solution qui fonctionne. Ce que je pense, c'est que, parce que notre NG2App est d'abord bootstrapped, il n'a pas encore de référence à $ l'injecteur, alors quand j'essaie de l'utiliser dans ma déclaration de fournisseur (DEPS: ['$ injecteur']), ça ne fait pas " existe.
Qu'est-ce qui est incroyablement bizarre, c'est que je peux utiliser ce service dans un composant angulaire, mais pour une raison quelconque, je ne peux pas l'utiliser dans un service angulaire. P>
App.js P>
zone.js:522 Unhandled Promise rejection: Cannot read property 'get' of undefined ; Zone: <root> ; Task: Promise.then ; Value: TypeError: Cannot read property 'get' of undefined at useFactory (ng2app.module.ts:114) at _callFactory (core.es5.js:9604) at _createProviderInstance$1 (core.es5.js:9547) at initNgModule (core.es5.js:9498) at new NgModuleRef_ (core.es5.js:10606) at createNgModuleRef (core.es5.js:10590) at Object.debugCreateNgModuleRef [as createNgModuleRef] (core.es5.js:12874) at NgModuleFactory_.create (core.es5.js:13869) at core.es5.js:4556 at ZoneDelegate.invoke (zone.js:334) at Object.onInvoke (core.es5.js:3933) at ZoneDelegate.invoke (zone.js:333) at Zone.run (zone.js:126) at NgZone.run (core.es5.js:3801) at PlatformRef_._bootstrapModuleFactoryWithZone (core.es5.js:4554) at core.es5.js:4596 at ZoneDelegate.invoke (zone.js:334) at Zone.run (zone.js:126) at zone.js:713 at ZoneDelegate.invokeTask (zone.js:367) at Zone.runTask (zone.js:166) at drainMicroTaskQueue (zone.js:546) at <anonymous> TypeError: Cannot read property 'get' of undefined at useFactory (http://localhost:9000/app.bundle.js:4404:52) at _callFactory (http://localhost:9000/vendor.bundle.js:10600:26) at _createProviderInstance$1 (http://localhost:9000/vendor.bundle.js:10543:26) at initNgModule (http://localhost:9000/vendor.bundle.js:10494:13) at new NgModuleRef_ (http://localhost:9000/vendor.bundle.js:11602:9) at createNgModuleRef (http://localhost:9000/vendor.bundle.js:11586:12) at Object.debugCreateNgModuleRef [as createNgModuleRef] (http://localhost:9000/vendor.bundle.js:13870:12) at NgModuleFactory_.create (http://localhost:9000/vendor.bundle.js:14865:25) at http://localhost:9000/vendor.bundle.js:5552:61 at ZoneDelegate.invoke (http://localhost:9000/vendor.bundle.js:289131:26) at Object.onInvoke (http://localhost:9000/vendor.bundle.js:4929:37) at ZoneDelegate.invoke (http://localhost:9000/vendor.bundle.js:289130:32) at Zone.run (http://localhost:9000/vendor.bundle.js:288923:43) at NgZone.run (http://localhost:9000/vendor.bundle.js:4797:62) at PlatformRef_._bootstrapModuleFactoryWithZone (http://localhost:9000/vendor.bundle.js:5550:23) at http://localhost:9000/vendor.bundle.js:5592:59 at ZoneDelegate.invoke (http://localhost:9000/vendor.bundle.js:289131:26) at Zone.run (http://localhost:9000/vendor.bundle.js:288923:43) at http://localhost:9000/vendor.bundle.js:289510:57 at ZoneDelegate.invokeTask (http://localhost:9000/vendor.bundle.js:289164:31) at Zone.runTask (http://localhost:9000/vendor.bundle.js:288963:47) at drainMicroTaskQueue (http://localhost:9000/vendor.bundle.js:289343:35) at <anonymous> consoleError @ zone.js:522 handleUnhandledRejection @ zone.js:527 _loop_1 @ zone.js:562 drainMicroTaskQueue @ zone.js:566 Promise resolved (async) scheduleQueueDrain @ zone.js:505 scheduleMicroTask @ zone.js:513 ZoneDelegate.scheduleTask @ zone.js:356 Zone.scheduleTask @ zone.js:196 Zone.scheduleMicroTask @ zone.js:207 scheduleResolveOrReject @ zone.js:711 ZoneAwarePromise.then @ zone.js:800 PlatformRef_._bootstrapModuleWithZone @ core.es5.js:4596 PlatformRef_.bootstrapModule @ core.es5.js:4581 (anonymous) @ ng2app.module.ts:140 __webpack_require__ @ bootstrap 2f644bad14cb0bb324ab:691 fn @ bootstrap 2f644bad14cb0bb324ab:110 (anonymous) @ app.js:116 __webpack_require__ @ bootstrap 2f644bad14cb0bb324ab:691 fn @ bootstrap 2f644bad14cb0bb324ab:110 (anonymous) @ util (ignored):1 __webpack_require__ @ bootstrap 2f644bad14cb0bb324ab:691 webpackJsonpCallback @ bootstrap 2f644bad14cb0bb324ab:23 (anonymous) @ app.bundle.js:1
3 Réponses :
OK, j'ai donc compris un hack pour le faire fonctionner. C'est super brut, mais ça marche. Il faut y avoir une meilleure solution, donc je ne le marquez pas aussi résolu et que quiconque propose une meilleure solution obtient toujours la prime.
import { Component } from '@angular/core'; import {Inject} from "@angular/core"; import UserService from 'app/login/user.service'; import template from 'tmpl.html'; @Component({ selector: 'an-angular-component', template, }) export class AnAngularComponent{ constructor( @Inject('UserService') private userService: any, ){ userService.then((us)=>{ console.log(us); }) } }
Avez-vous essayé avec usefactory: (forgerref ((() => '$ injecteur') i: tout) => i.get (userservice ') code>?
Je n'ai pas. Je vais l'essayer dans une seconde, alors que je le fais, intégrez-le comme une réponse et si cela fonctionne, vous obtiendrez la solution :-)
J'ai des difficultés à obtenir la syntaxe correcte afin que cela fonctionne avec des documents. La façon dont vous avez écrites indique ')' attendu. Déclaration ou déclaration attendue. ...etc
@camaron essayant toujours de faire fonctionner la fonction de référence en avant. Typescript ne se plaint pas et je ne suis pas tout à fait sûr comment l'obtenir pour s'arrêter dans ce cas
Quelle est l'erreur spécifique que Docscript vous donne? Notez également que l'utilisation de injectable () code> et
injecter (jeton) code> est potentiellement problématique car ils créent tous deux des métadonnées pour résoudre la même dépendance. Dans ce cas, étant donné que
userservice code> est saisi en tant que
tout code> le compilateur émettra des métadonnées de décorateur spécifiant la dépendance comme
objet code>, ce qui n'est pas ce que vous voulez.
@Aluanhaddad L'erreur spécifique avec TypeScript a dû le faire avec la syntaxe d'obtenir ForwardRef pour travailler. Je n'ai jamais compris comment le faire.
Désolé, je ne suis pas sûr de ce que tu veux dire. Il n'y a pas de syntaxe unique à Forwardref Code>
Il semble être un problème avec la timming du Ici vous Besoin du dans le DOCS Il est indiqué que vous devez utiliser le édité par Andrew Luhring pour la postérité em>
Malheureusement, cela n'a pas fonctionné même si c'est exactement ce qui est écrit dans les documents angulaires. La réponse originale ici était: p> et qui semblait plus proche d'une réponse à celle-ci. Cela ne fonctionne pas non plus, mais cela semble être dû au fait que le type dactylographie ne pense pas que la syntaxe a raison. P> update strong>: p> Nous étions tellement obsédé par le @ngModule ({fournisseurs: []}) code> et la mise à niveau
.bootstrap code> résolution.
$ injecteur code> mais il n'a pas été injecté pour le moment qu'il a été demandé. p>
usefactory code> que nous n'avons pas vu que le correctif était juste d'ajouter le
Forwardref code> au service. P>
@Injectable()
export class AnAngularService{
constructor(@Inject(forwardRef(() => 'UserService')) private userService: UserService
){}
}
Je reçois [at-loader] ./src/app/ng2app.module.ts:113:30 TS1005: '=' attendu. [at-loader] ./src/app/ng2app.module.ts:113:49 TS1005: ',' attendu. Il se plaint de la parenthèse d'ouverture dans FADYREF (<---- et de la parenthèse de fermeture après tout) <---
Je vais mettre à jour la réponse, cela ne fonctionnera pas dans une usine.
Non. C'est fondamentalement la chose exacte des documents angulaires à faire et c'est ce qui cause le rejet de la promesse non confondu du : impossible de lire la propriété 'Get' de l'erreur indéfinie code>. Je pense que vous étiez sur quelque chose avec Forwardref, mais je ne peux pas comprendre comment le faire fonctionner
Yeap, forgerref code> vous donnera un délai d'attente jusqu'à ce que l'application puisse accéder à
$ injecteur code>. Laissez-moi voir si je peux créer un plumber pour ce problème.
Vous faites génial en ce moment. tu gouvernes
Lance une pousse longue, usefactory: ($ injecteur: n'importe quel) => $ injecteur.get ('userservice') code> avec le
de DEPS: ['$ injecteur'] code>, i ne peut pas créer le plunker dans le bureau haha.
lol c'est la première chose que nous avons essayée lol. la chose de transmetteur est ce que je pense que la solution est mais je ne peux pas le faire fonctionner
Si vous obtenez la chose vers l'avant de travailler, je pense que ce sera la solution tbh. Je vais éditer pour montrer votre réponse originale car cela semble plus proche de la solution que ce que vous avez maintenant, c'est exactement ce qui est dans les documents angulaires et cela ne fonctionne pas.
Mettre à jour! J'espère que cela aide, vous pouvez supprimer le fournisseur du ngmodule code>, vous ajoutez le service dans le
bootstrap code>.
Attendez supprimer le fournisseur de la NGMODULE? Si je fais que je reçois "Aucun fournisseur trouvé pour userservice" lorsque j'injecte votre code. est-ce que je fais quelque chose comme @Inject (forgerref (($ i) => $ i.get (userservice ')) userservice privé: userservice? Qu'est-ce que vous avez dans votre mise à jour en ce moment échoue à l'heure actuelle avec la ne peut pas lire de choses non définies encore
J'ai pu contourner ce problème en utilisant la classe Angular Core INJUSTEUR CODE> pour obtenir le service Angularjs mis à niveau en cas de besoin, au lieu de l'injecter dans le constructeur.
import { Injector } from '@angular/core';
@Injectable()
class MyAngularService {
constructor(private injector: Injector) {
//
}
myMethodUsingUpgradedService() {
const myAngularJsUpgradedService = this.injector('MyAngularJsUpgradedService');
// myAngularJsUpgradedService is now available
}
}
Obtenir cette erreur: Impossible d'invoquer une expression dont le type n'a pas de signature d'appel. Le type 'injecteur' n'a pas de signatures d'appel compatibles.
Pouvez-vous ajouter l'erreur?
Je viens d'ajouter la stacktrace.
usefactory: (i: tout) => i.get (userservice ') code> ne devrait pas
i code> être saisi? J'ai la même erreur de plusieurs fois lorsqu'un
observable code> était attendu mais j'ai donné un objet.