Error al intentar inyectar un servicio en un componente angular "EXCEPCIÓN: No se pueden resolver todos los parámetros del componente", ¿por qué?

448
Keith Otto 2016-06-24 07:07.

Creé una aplicación básica en Angular, pero me encontré con un problema extraño en el que no puedo inyectar un servicio en uno de mis componentes. Sin embargo, se inyecta bien en cualquiera de los otros tres componentes que he creado.

Para empezar, este es el servicio:

import { Injectable } from '@angular/core';

@Injectable()
export class MobileService {
  screenWidth: number;
  screenHeight: number;

  constructor() {
    this.screenWidth = window.outerWidth;
    this.screenHeight = window.outerHeight;

    window.addEventListener("resize", this.onWindowResize.bind(this) )
  }
  
  onWindowResize(ev: Event) {
    var win = (ev.currentTarget as Window);
    this.screenWidth = win.outerWidth;
    this.screenHeight = win.outerHeight;
  }
  
}

Y el componente con el que se niega a trabajar:

import { Component, } from '@angular/core';
import { NgClass } from '@angular/common';
import { ROUTER_DIRECTIVES } from '@angular/router';

import {MobileService} from '../';

@Component({
  moduleId: module.id,
  selector: 'pm-header',
  templateUrl: 'header.component.html',
  styleUrls: ['header.component.css'],
  directives: [ROUTER_DIRECTIVES, NgClass],
})
export class HeaderComponent {
  mobileNav: boolean = false;

  constructor(public ms: MobileService) {
    console.log(ms);
  }

}

El error que obtengo en la consola del navegador es este:

EXCEPCIÓN: No se pueden resolver todos los parámetros para HeaderComponent: (?).

Tengo el servicio en la función de arranque, por lo que tiene un proveedor. Y parece que puedo inyectarlo en el constructor de cualquiera de mis otros componentes sin problemas.

30 answers

462
Günter Zöchbauer 2016-06-24 09:34.

Importarlo desde el archivo donde se declara directamente en lugar del barril.

No sé qué causa exactamente el problema, pero lo vi mencionado varias veces (probablemente algún tipo de dependencia circular).

También debería ser reparable cambiando el orden de las exportaciones en el barril (no sé detalles, pero también se mencionó)

345
J.P. ten Berge 2016-10-23 14:56.

Además de las respuestas anteriores dadas, parece que este error también se produce cuando a su servicio inyectable le falta el @Injectable()decorador real . Entonces, antes de depurar la dependencia cíclica y el orden de sus importaciones / exportaciones, haga una simple verificación si su servicio realmente se ha @Injectable()definido.

Esto se aplica a la versión actual de Angular, Angular 2.1.0.

Abrí un problema sobre este asunto .

113
Reactgular 2016-12-12 15:37.

A partir de Angular, 2.2.3ahora hay una forwardRef()función de utilidad que le permite inyectar proveedores que aún no se han definido.

Por no definido, me refiero a que el mapa de inyección de dependencia no conoce el identificador. Esto es lo que sucede durante las dependencias circulares. Puede tener dependencias circulares en Angular que son muy difíciles de desenredar y ver.

export class HeaderComponent {
  mobileNav: boolean = false;

  constructor(@Inject(forwardRef(() => MobileService)) public ms: MobileService) {
    console.log(ms);
  }

}

Agregar @Inject(forwardRef(() => MobileService))al parámetro del constructor en el código fuente de la pregunta original solucionará el problema.

Referencias

Manual de Angular 2: ForwardRef

Reenviar referencias en Angular 2

73
J.M.I. MADISON 2017-11-28 08:52.

INCORRECTO # 1: Olvidar al decorador:

//Uncaught Error: Can't resolve all parameters for MyFooService: (?).
export class MyFooService { ... }

INCORRECTO # 2: Omitir el símbolo "@":

//Uncaught Error: Can't resolve all parameters for MyFooService: (?).
Injectable()
export class MyFooService { ... }

INCORRECTO # 3: Omitir los símbolos "()":

//Uncaught Error: Can't resolve all parameters for TypeDecorator: (?).
@Injectable
export class MyFooService { ... }

INCORRECTO # 4: "i" minúscula:

//Uncaught ReferenceError: injectable is not defined
@injectable
export class MyFooService { ... }

INCORRECTO # 5: Olvidó: importar {Injectable} desde '@ angular / core';

//Uncaught ReferenceError: Injectable is not defined
@Injectable
export class MyFooService { ... }

CORRECTO:

@Injectable()
export class MyFooService { ... }
26
Michael 2016-06-25 15:16.

Como ya se dijo, el problema es causado por el pedido de exportación dentro del barril que es causado por dependencias circulares.

Una explicación más detallada está aquí: https://stackoverflow.com/a/37907696/893630

22
Stephen Paul 2016-11-10 05:05.

También encontré esto al inyectar el servicio A en el servicio B y viceversa.

Creo que es bueno que esto falle rápidamente, ya que probablemente debería evitarse de todos modos . Si desea que sus servicios sean más modulares y reutilizables, es mejor evitar las referencias circulares tanto como sea posible. Esta publicación destaca las trampas que rodean eso.

Por tanto, tengo las siguientes recomendaciones:

  • Si cree que las clases interactúan con demasiada frecuencia (estoy hablando de la envidia de las funciones ), es posible que desee considerar la posibilidad de fusionar los 2 servicios en 1 clase .
  • Si lo anterior no funciona para usted, considere usar un tercer servicio , (an EventService) que ambos servicios pueden inyectar para intercambiar mensajes.
18
HockeyJ 2017-02-16 06:00.

Para beneficio de los buscadores; Recibí este error. Era simplemente un símbolo @ faltante.

Es decir, esto produce el Can't resolve all parameters for MyHttpServiceerror.

Injectable()
export class MyHttpService{
}

Agregar el @símbolo que falta lo corrige.

@Injectable()
export class MyHttpService{
}
10
Bart 2017-10-21 00:23.

Además del @Injectable()decorador perdido

El @Injectable()decorador faltante en la clase abstracta produjo el No se pueden resolver todos los parámetros para el servicio: (?) El decorador debe estar presente MyServicetanto en la clase derivada como en ella.BaseService

//abstract class
@Injectable()
abstract class BaseService { ... }

//MyService    
@Injectable()
export class MyService extends BaseService {
.....
}
10
AJ Richardson 2018-05-16 09:28.

En mi caso, necesitaba agregar import "core-js/es7/reflect";a mi aplicación para que @Injectablefuncionara.

9
Stewart_R 2018-03-01 01:31.

Otra posibilidad es no haberse emitDecoratorMetadataestablecido en true en tsconfig.json

{
  "compilerOptions": {

     ...

    "emitDecoratorMetadata": true,

     ...

    }

}
8
M K 2017-04-27 04:01.

Obtiene este error si tiene el servicio A que depende de una propiedad estática / método de servicio B y el servicio B en sí depende del servicio A a través de la inyección de dependencia. Entonces es una especie de dependencia circular, aunque no lo es, ya que la propiedad / método es estático. Probablemente un error que ocurre en combinación con AOT .

7
Alf Moh 2017-09-28 03:27.

En mi caso, sucedió porque no declaré el tipo de un parámetro de constructor.

Tuve algo como esto:

constructor(private URL, private http: Http) { }

y luego cambiarlo al código de abajo resolvió mi problema.

constructor(private URL : string, private http: Http) {}
5
repo 2018-05-16 21:58.

para mí fue solo la falta de ()@Injectable. Lo adecuado es @Injectable ()

4
Matjaz Hirsman 2017-02-16 23:34.

La eliminación de parámetros del método constructor () inyectable lo resolvió para mi caso.

4
Tinh Dang 2018-05-18 00:54.

En mi caso fue por el complemento Augury, deshabilitarlo funcionará bien. La opción alternativa es aot, también funciona.

todos los créditos a @ Boboss74, publicó la respuesta aquí: https://github.com/angular/angular/issues/23958

4
otiai10 2019-04-03 20:18.

Esta respuesta puede ser muy útil para este problema. Además, para mi caso, exportar el servicio como defaultfue la causa.

INCORRECTO:

@Inject()
export default class MobileService { ... }

CORRECTO:

@Inject()
export class MobileService { ... }
2
Ophir Stern 2017-01-25 06:03.

Bueno, para mí el problema fue aún más molesto, estaba usando un servicio dentro de un servicio y olvidé agregarlo como dependencia en el módulo de aplicación. Espero que esto ayude a alguien a ahorrar varias horas descomponiendo la aplicación solo para volver a construirla

2
maleman 2017-02-07 10:21.

Encontré este error al escribir mal el nombre del servicio, es decir, constructor (privado myService: MyService ).

Para los servicios mal escritos, pude determinar qué servicio era el problema (tenía varios enumerados en el constructor) inspeccionando la página en Chrome-> Console. Verá como parte del mensaje una lista de matriz de "parámetros" mostrando el objeto Objeto, objeto Objeto,? (o algo así). Observe dónde aparece el "?" es y esa es la posición del servicio que está causando el problema.

2
Shivang Gupta 2017-05-22 21:21.

Debe agregar una matriz de proveedores en el decorador @Component o en el módulo donde se declara su componente. Dentro del componente puede hacer lo siguiente:

@Component({
  moduleId: module.id,
  selector: 'pm-header',
  templateUrl: 'header.component.html',
  styleUrls: ['header.component.css'],
  directives: [ROUTER_DIRECTIVES, NgClass],
  providers: [MobileService]
})
2
Codiee 2017-12-14 23:00.

En mi caso, pasar parámetros incorrectos al constructor genera este error, la idea básica sobre este error es que, sin saberlo, pasó algunos argumentos incorrectos a cualquier función.

export class ProductComponent {
    productList: Array<Product>;

    constructor(productList:Product) { 
         // productList:Product this arg was causing error of unresolved parameters.
         this.productList = [];
    }
}

Resolví esto simplemente eliminando ese argumento.

2
Ahmed Elkoussy 2018-05-30 03:01.

Para mí, recibí este error cuando deshabilité por error esta importación en el archivo polyfills.ts, debe asegurarse de que se importe para evitar ese error.

/** Evergreen browsers require these. **/
// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
import 'core-js/es7/reflect';
2
Muhammed Ozdogan 2018-07-21 02:04.

En mi caso, estaba intentando extender " NativeDateAdapter" para anular el format(date: Date, displayFormat: Object)método " ".

En AngularMaterial-2 DatePicker.

Así que básicamente me olvidé de agregar una @Injectableanotación.

Después de agregar esto a mi clase "CustomDateAdapter":

@Injectable({
  providedIn: 'root'
})

El error se ha ido.

2
sarora 2019-05-03 12:45.

Este puede ser un problema realmente difícil de depurar debido a la falta de comentarios en el error. Si está preocupado por una dependencia cíclica real, esto es lo más importante que debe observar en el seguimiento de la pila: a) el nombre del servicio b) el parámetro del constructor en ese servicio que tiene un signo de interrogación, por ejemplo, si se ve así:

no se pueden resolver todos los parámetros para AuthService: ([objeto objeto], [objeto objeto], [objeto objeto], [objeto objeto],?)

entonces significa que el quinto parámetro es un servicio que también depende de AuthService. es decir, signo de interrogación, significa que DI no lo resolvió.

A partir de ahí, solo necesita desacoplar los 2 servicios reestructurando el código.

2
Cristian Traìna 2019-05-25 03:43.

¡Te tengo!

Si ninguna de las respuestas anteriores lo ayudó, tal vez esté importando algún elemento del mismo archivo donde un componente está inyectando el servicio.

Te explico mejor:

Este es el archivo de servicio :

// your-service-file.ts
import { helloWorld } from 'your-component-file.ts'

@Injectable()
export class CustomService() {
  helloWorld()
}

Este es el archivo de componentes :

@Component({..})
export class CustomComponent {
  constructor(service: CustomService) { }
}

export function helloWorld() {
  console.log('hello world');
}

Por lo tanto, causa problemas incluso si el símbolo no está dentro del mismo componente, sino solo dentro del mismo archivo. Mueva el símbolo (puede ser una función, una constante, una clase, etc.) a otro lugar y el error desaparecerá.

1
Ahmad Baktash Hayeri 2018-02-23 00:49.

Si bien es posible que se haya mencionado el ordenamiento de las clases exportadas desde dentro de los barriles, el siguiente escenario también puede producir el mismo efecto.

Suponga que tiene clases A, By Cexporta desde el mismo archivo donde Adepende de By C:

@Injectable()
export class A {
    /** dependencies injected */
    constructor(private b: B, private c: C) {}
}

@Injectable()
export class B {...}

@Injectable()
export class C {...}

Dado que las clases dependientes (es decir, en este caso las clases By C) aún no son conocidas por Angular, ( probablemente en tiempo de ejecución durante el proceso de inyección de dependencia de Angular en la claseA ) se genera el error.

Solución

La solución es declarar y exportar las clases dependientes antes que la clase donde se realiza la DI.

es decir, en el caso anterior, la clase Ase declara justo después de definir sus dependencias:

@Injectable()
export class B {...}

@Injectable()
export class C {...}

@Injectable()
export class A {
    /** dependencies injected */
    constructor(private b: B, private c: C) {}
}
1
Menelaos Kotsollaris 2018-04-25 12:52.

En mi caso, estaba exportando una Clase y una Enum desde el mismo archivo de componente:

mComponent.component.ts:

export class MyComponentClass{...}
export enum MyEnum{...}

Entonces, estaba tratando de usar MyEnumde un niño de MyComponentClass. Eso estaba causando el error No se pueden resolver todos los parámetros .

Al moverme MyEnuma una carpeta separada de MyComponentClass, ¡eso resolvió mi problema!

Como mencionó Günter Zöchbauer, esto sucede porque un servicio o componente es circularmente dependiente.

1
Simon_Weaver 2018-07-22 13:14.

Si su servicio está definido en el mismo archivo que un componente (que lo consume) y el servicio se define después del componente en el archivo, puede obtener este error. Esto se debe al mismo problema de 'forwardRef' que han mencionado otros. En este momento, VSCode no es bueno para mostrarle este error y la compilación se compila con éxito.

Ejecutar la compilación con --aotpuede enmascarar este problema debido a la forma en que funciona el compilador (probablemente relacionado con la sacudida del árbol).

Solución: asegúrese de que el servicio esté definido en otro archivo o antes de la definición del componente. (No estoy seguro de si se puede usar forwardRef en este caso, pero parece torpe hacerlo).

Si tengo un servicio muy simple que está fuertemente vinculado a un componente (algo así como un modelo de vista), por ejemplo. ImageCarouselComponent, Puedo nombrarlo ImageCarouselComponent.service.tspara que no se mezcle con mis otros servicios.

1
lucbonnin 2018-09-25 22:45.

En mi caso fue una referencia circular. Tenía MyService llamando a Myservice2 y MyService2 llamando a MyService.

No está bien :(

1
Vic Seedoubleyew 2018-09-29 06:04.

En mi caso, el motivo fue el siguiente:

  • mi servicio inyectable A extendió otra clase B
  • B tenía un constructor que requería un argumento
  • No había definido ningún constructor en A

Como consecuencia, al intentar crear un objeto A, el constructor predeterminado falló. No tengo idea de por qué esto no fue un error de compilación.

Lo solucioné simplemente agregando un constructor en A, que llamó correctamente al constructor de B.

1
lolcatzftw 2020-04-28 00:10.

para angular 6 y versiones más recientes, pruebe

@Injectable({
  providedIn: 'root'
})

.. Justo encima de su clase de servicio sin otras líneas en el medio

ventajas

  • no es necesario agregar el servicio a ningún módulo (será "descubierto automáticamente")
  • el servicio será un singleton (ya que se inyectará en la raíz)

[ documentos angulares ]

Related questions

MORE COOL STUFF

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

¿Caduca el repelente de insectos?

¿Caduca el repelente de insectos?

¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?

Actualice a un Sonicare por tan solo $ 30

Actualice a un Sonicare por tan solo $ 30

¿Quiere probar un cepillo de dientes Sonicare sin gastar mucho dinero en uno de sus modelos favoritos de gama alta? Puede comprar un kit de la Serie 2 o Serie 3 por tan solo $ 30 hoy en Amazon. Haga clic aquí para ver la lista completa de modelos elegibles y tenga en cuenta que se descontarán $ 10 adicionales en su carrito.

Ponle una tapa. En realidad, ponle una tapa a todo. Consigue 12 tapas de cocina elásticas de silicona por $14. [Exclusivo]

Ponle una tapa. En realidad, ponle una tapa a todo. Consigue 12 tapas de cocina elásticas de silicona por $14. [Exclusivo]

Tapas elásticas de silicona de Tomorrow's Kitchen, paquete de 12 | $14 | Amazonas | Código promocional 20OFFKINJALids son básicamente los calcetines de la cocina; siempre perdiéndose, dejando contenedores huérfanos que nunca podrán volver a cerrarse. Pero, ¿y si sus tapas pudieran estirarse y adaptarse a todos los recipientes, ollas, sartenes e incluso frutas en rodajas grandes que sobran? Nunca más tendrás que preocuparte por perder esa tapa tan específica.

Cuéntanos tus mejores trucos de Washington, DC

Cuéntanos tus mejores trucos de Washington, DC

Hemos pirateado algunas ciudades industriales en esta columna, como Los Ángeles y Las Vegas. Ahora es el momento de una ciudad militar-industrial-compleja.

Un minorista está eliminando su sección de tallas grandes y mezclando tallas más grandes con todo lo demás

Un minorista está eliminando su sección de tallas grandes y mezclando tallas más grandes con todo lo demás

Un minorista está enlatando su sección de tallas grandes. Pero no están tomando la categoría solo en línea o descontinuándola por completo.

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.

India me está pateando el culo

India me está pateando el culo

Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

¿Merrick Garland le ha fallado a Estados Unidos?

Es más de la mitad de la presidencia de Biden. ¿Qué está esperando Merrick Garland?

¿Merrick Garland le ha fallado a Estados Unidos?

Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.

Language