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 pasi code> être saisi? J'ai la même erreur de plusieurs fois lorsqu'unobservable code> était attendu mais j'ai donné un objet.