He creado una aplicación básica en Angular 2, pero he encontrado 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 bootstrap, por lo que tiene un proveedor. Y parece que puedo inyectarlo en el constructor de cualquiera de mis otros componentes sin problema.
angular
angular2-di
Keith Otto
fuente
fuente
'../'
unindex.ts
(barril)? ¿Puedes intentar importarlo desde el archivo donde se declara directamente?Respuestas:
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 se conocen detalles, pero también se mencionó)
fuente
2.0.2
). Encuentro que los barriles siguen siendo útiles, especialmente cuando necesito importar varios modelos y servicios entre diferentes módulos. Estoimport { cleanValues, getState, FirebaseService, NotificationService, ... } from '../../shared/services';
fue un dolor cuando no funcionó (;NgModule
no es ayuda con los servicios de singleton ...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 cuestión de 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 última versión actual de Angular, Angular 2.1.0.
Abrí un problema sobre este asunto .
fuente
Router
desde '@ angular / router' y sin ese inyectable, este error siempre ocurrirá (tan pronto como decida hacer una línea de uso de código que enrutador inyectado.@injectable()
no es necesaria. Lo cual es otra rareza en sí mismo. Sin embargo, aún así lo agregaría, simplemente para cuando alguna vez decidas inyectar algo.A partir de Angular,
2.2.3
ahora hay unaforwardRef()
función de utilidad que le permite inyectar proveedores que aún no se han definido.Por no definido, quiero decir 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.
Agregar
@Inject(forwardRef(() => MobileService))
al parámetro del constructor en el código fuente de la pregunta original solucionará el problema.Referencias
Angular 2 Manual: ForwardRef
Reenviar referencias en Angular 2
fuente
forwardRef()
ya estaba allí en alfa ;-) Solo es necesario si elMobile
servicio se declara más abajo en el mismo archivo. Si las clases están en diferentes archivos, no hay necesidad deforwardRef()
forwardRef()
ayudó a deshacerme delCan't resolve all parameters for ...
mensaje. Al menos el componente funciona mientras busco una mejor solución al problema. (Y sí, la dependencia que falla se importa directamente de su archivo)forwardRef
. Es muy dificil de encontrar. Ayer me llevó todo el día resolver este problema.foreardRef
mí mismo, pero ya no después de haberNgModule
sido presentado. No estoy preocupado por perder repeticiones. Tengo curiosidad por saber por qué te encuentras con esto después de que esto ya no apareció desde hace unos meses. Tendré un vistazo más de cerca cuando vuelva a casa en unos días. Muchas gracias por los comentarios.INCORRECTO # 1: Olvidando al decorador:
INCORRECTO # 2: Omitiendo el símbolo "@":
INCORRECTO # 3: Omitiendo símbolos "()":
INCORRECTO # 4: "i" minúscula:
INCORRECTO # 5: Olvidó: importar {Inyectable} desde '@ angular / core';
CORRECTO:
fuente
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
fuente
También me encontré con 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 dificultades que la rodean.
Por lo tanto, tengo las siguientes recomendaciones:
EventService
) que ambos servicios pueden inyectar para intercambiar mensajes.fuente
En beneficio de los buscadores; Tengo este error Era simplemente un símbolo @ perdido.
Es decir, esto produce el
Can't resolve all parameters for MyHttpService
error.Agregar el
@
símbolo que falta lo arregla.fuente
En mi caso, necesitaba agregar
import "core-js/es7/reflect";
a mi aplicación para hacer el@Injectable
trabajo.fuente
Otra posibilidad es no haber
emitDecoratorMetadata
establecido en verdadero en tsconfig.jsonfuente
Obtiene este error si tiene el servicio A que depende de una propiedad / método estático del servicio B y el servicio B en sí depende de la inyección de dependencia a través del servicio A. Por lo tanto, es una especie de dependencia circular, aunque no lo es, ya que la propiedad / método es estática. Probablemente un error que ocurre en combinación con AOT .
fuente
A -> B
y ambos usaban la misma clase estática. La solución conforwardRef
ayuda, pero voy a ver cómo esto podría desenredarse. Probablemente intentaré hacer un servicio real con esta clase estática (esto también conducirá a un mejor diseño).Además del
@Injectable()
decorador perdidoEl
@Injectable()
decorador faltante en la clase abstracta produjo No se pueden resolver todos los parámetros para el servicio: (?) El decorador debe estar presenteMyService
tanto como en la clase derivadaBaseService
fuente
En mi caso, sucedió porque no declaró el tipo para un parámetro constructor.
Tenía algo como esto:
y luego cambiarlo al código a continuación resolvió mi problema.
fuente
para mí fue solo falta de
()
@Injectable. Proper is @Injectable ()fuente
Eliminar parámetros del método constructor inyectable () lo resolvió para mi caso.
fuente
En mi caso fue por el plugin Augury, deshabilitarlo funcionará bien. La opción alternativa no es, también funciona.
Todos los créditos a @ Boboss74, publicó la respuesta aquí: https://github.com/angular/angular/issues/23958
fuente
Bueno, para mí el problema era 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 desglosando la aplicación solo para volver a compilarla
fuente
@Inject
anotación. Estaba pasando por alto exactamente lo que dice un poco el mensaje de error. Si no sospecha dependencias circulares, simplemente vaya a la clase mencionada en el error y mire todos los parámetros del constructor y cualquier miembro de la clase anotado@Inject
y asegúrese de que está haciendo DI correctamente en todos ellos. Más sobre DI aquí: angular.io/docs/ts/latest/guide/dependency-injection.htmlDebe agregar la matriz de proveedores en el decorador @Component o en el módulo donde se declara su componente. Componente interno puede hacer lo siguiente:
fuente
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.
Resolví esto simplemente eliminando ese argumento.
fuente
Para mí, recibí este error cuando desactivé esta importación por error en el archivo polyfills.ts, debe asegurarse de que se importe para evitar ese error.
fuente
En mi caso, estaba intentando extender el método
NativeDateAdapter
"format(date: Date, displayFormat: Object)
" para anular " ".En AngularMaterial-2 DatePicker.
Así que básicamente olvidé agregar
@Injectable
anotaciones.Después de agregar esto a mi clase "CustomDateAdapter":
El error se ha ido.
fuente
Esta respuesta puede ser muy útil para este problema. Además, para mi caso, exportar el servicio como
default
fue la causa.INCORRECTO:
CORRECTO:
fuente
Este puede ser un problema realmente difícil de depurar debido a la falta de comentarios en el error. Si le preocupa 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 constructor en ese servicio que tiene un signo de interrogación, por ejemplo, si se ve así:
entonces significa que el quinto parámetro es un servicio que también depende de AuthService. es decir, signo de interrogación, significa que no fue resuelto por DI.
A partir de ahí, solo necesita desacoplar los 2 servicios reestructurando el código.
fuente
He encontrado este error al escribir mal el nombre del servicio, es decir, constructor ( myService privado : MyService ).
Para los servicios mal escritos, pude determinar qué servicio era el problema (tenía varios listados en el constructor) inspeccionando la página en Chrome-> Console. Verá como parte del mensaje una lista de matriz de "parámetros" al mostrar el objeto Object, object Object,? (o algo así). Observe dónde está el "?" es y esa es la posición del servicio que está causando el problema.
fuente
Aunque puede haberse mencionado el pedido de clases exportadas desde barriles, el siguiente escenario también puede producir el mismo efecto.
Suponga que tiene clases
A
,B
yC
exportado desde dentro del mismo archivo en el queA
depende deB
yC
:Dado que las clases dependientes (es decir, en este caso, las clases
B
yC
) 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 de la clase donde se realiza la DI.
es decir, en el caso anterior, la clase
A
se declara justo después de definir sus dependencias:fuente
En mi caso, estaba exportando una Clase y una Enum desde el mismo archivo de componente:
mComponent.component.ts
:Entonces, estaba tratando de usar
MyEnum
de un niño deMyComponentClass
. Eso estaba causando el error No se puede resolver todos los parámetros .Al moverme
MyEnum
en una carpeta separada deMyComponentClass
, ¡eso resolvió mi problema!Como mencionó Günter Zöchbauer, esto está sucediendo debido a que un servicio o componente depende circularmente.
fuente
Si su servicio se define 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 'forwardRef' que otros han mencionado. En este momento, VSCode no es excelente para mostrarle este error y la compilación se compila correctamente.
Ejecutar la compilación con
--aot
puede 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 utilizar forwardRef en este caso, pero parece torpe hacerlo).
Si tengo un servicio muy simple que está fuertemente vinculado a un componente (como un modelo de vista), por ejemplo.
ImageCarouselComponent
, Puedo nombrarloImageCarouselComponent.service.ts
para que no se mezcle con mis otros servicios.fuente
En mi caso fue una referencia circular. Tenía MyService llamando a Myservice2 y MyService2 llamando a MyService.
No está bien :(
fuente
En mi caso, la razón fue la siguiente:
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 correctamente llamó al constructor de B.
fuente
Gotcha!
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 :
Este es el archivo componente :
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 otra parte y el error se desvanecerá.
fuente
para angular 6 y versiones más nuevas, intente
.. justo encima de su clase de servicio sin otras líneas intermedias
ventajas
[ documentos angulares ]
fuente