7
votes

NgupGrade angulaire injecter un service angularjs en service angulaire; Obtenir: Rejet de promesse non géré: ne peut pas lire les biens «Get» de non défini; Zone:

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 commentaires

Pouvez-vous ajouter l'erreur?


Je viens d'ajouter la stacktrace.


usefactory: (i: tout) => i.get (userservice ') ne devrait pas i être saisi? J'ai la même erreur de plusieurs fois lorsqu'un observable était attendu mais j'ai donné un objet.


3 Réponses :


3
votes

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); })
  }
}


7 commentaires

Avez-vous essayé avec usefactory: (forgerref ((() => '$ injecteur') i: tout) => i.get (userservice ') ?


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 () et injecter (jeton) 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 est saisi en tant que tout le compilateur émettra des métadonnées de décorateur spécifiant la dépendance comme objet , 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



3
votes

Il semble être un problème avec la timming du @ngModule ({fournisseurs: []}) code> et la mise à niveau .bootstrap code> résolution.

Ici vous Besoin du $ injecteur code> mais il n'a pas été injecté pour le moment qu'il a été demandé. p>

dans le DOCS Il est indiqué que vous devez utiliser le ngdoboottrap code> crochet. p> xxx pré>

é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> xxx pré>

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 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
  ){}
}


10 commentaires

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 . Je pense que vous étiez sur quelque chose avec Forwardref, mais je ne peux pas comprendre comment le faire fonctionner


Yeap, forgerref vous donnera un délai d'attente jusqu'à ce que l'application puisse accéder à $ injecteur . 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') avec le de DEPS: ['$ injecteur'] , 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 , vous ajoutez le service dans le bootstrap .


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



0
votes

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
  }
}


1 commentaires

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.