parametros - pasar datos de un componente a otro angular 2
Error angular DI-EXCEPCIÓN: no se pueden resolver todos los parámetros (30)
He creado una aplicación básica en Angular, 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.
A partir de Angular
2.2.3
ahora hay una función de utilidad
forwardRef()
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.
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
A veces esto sucede cuando declaras el módulo incorporado de Angular (HttpClientModule, HttpErrorResponse, etc.) en app.module.js. También enfrenté el mismo problema pero lo resolví ahora.
El error que hice fue mencionar HttpClientModule en Proveedores en lugar de Importar módulo angular
Además de las respuestas anteriores dadas, parece que este error también se produce cuando a su servicio inyectable le falta el decorador
@Injectable()
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 tiene definido
@Injectable()
.
Esto se aplica a la última versión actual de Angular, Angular 2.1.0.
Además del decorador
@Injectable()
falta
La falta del decorador
@Injectable()
en la clase abstracta produjo No se pueden resolver todos los parámetros para el servicio: (?) El decorador debe estar presente en
MyService
así como en la clase derivada
BaseService
//abstract class
@Injectable()
abstract class BaseService { ... }
//MyService
@Injectable()
export class MyService extends BaseService {
.....
}
Al usar importaciones de barril, considere importar inyectables primero como regla general.
Aunque puede haberse mencionado el pedido de clases exportadas desde barriles, el siguiente escenario también puede producir el mismo efecto.
Suponga que tiene las clases
A
,
B
y
C
exportadas desde el mismo archivo donde
A
depende de
B
y
C
:
@Injectable()
export class A {
/** dependencies injected */
constructor(private b: B, private c: C) {}
}
@Injectable()
export class B {...}
@Injectable()
export class C {...}
Dado que Angular todavía no conoce las clases
dependientes
(es decir, en este caso, las clases
B
y
C
) (
probablemente en tiempo de ejecución durante el proceso de inyección de dependencia de Angular en la clase
A
), 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:
@Injectable()
export class B {...}
@Injectable()
export class C {...}
@Injectable()
export class A {
/** dependencies injected */
constructor(private b: B, private c: C) {}
}
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
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://.com/a/37907696/893630
Debe 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:
@Component({
moduleId: module.id,
selector: ''pm-header'',
templateUrl: ''header.component.html'',
styleUrls: [''header.component.css''],
directives: [ROUTER_DIRECTIVES, NgClass],
providers: [MobileService]
})
Eliminar parámetros del método constructor inyectable () lo resolvió para mi caso.
En beneficio de los buscadores; Tengo este error Era simplemente un símbolo @ perdido.
Es decir, esto produce el error
Can''t resolve all parameters for MyHttpService
.
Injectable()
export class MyHttpService{
}
Agregar el símbolo
@
falta lo arregla.
@Injectable()
export class MyHttpService{
}
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
En mi caso fue una referencia circular. Tenía MyService llamando a Myservice2 y MyService2 llamando a MyService.
No está bien :(
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
MyEnum
de un hijo de
MyComponentClass
.
Eso estaba causando el
error No se puede resolver todos los parámetros
.
¡Al mover
MyEnum
en una carpeta separada de
MyComponentClass
, eso resolvió mi problema!
Como mencionó Günter Zöchbauer, esto está sucediendo debido a que un servicio o componente depende circularmente.
En mi caso, estaba tratando de extender "
NativeDateAdapter
" para anular el método "
format(date: Date, displayFormat: Object)
".
En AngularMaterial-2 DatePicker.
Entonces, básicamente, olvidé agregar la
@Injectable
.
Después de agregar esto a mi clase "CustomDateAdapter":
@Injectable({
providedIn: ''root''
})
El error se ha ido.
En mi caso, la razón fue la 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 correctamente llamó al constructor de B.
En mi caso, necesitaba agregar la
import "core-js/es7/reflect";
a mi aplicación para hacer que
@Injectable
funcione.
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.
En mi caso, sucedió porque no declaró el tipo para un parámetro constructor.
Tenía algo como esto:
constructor(private URL, private http: Http) { }
y luego cambiarlo al código a continuación resolvió mi problema.
constructor(private URL : string, private http: Http) {}
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.
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ó)
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 .
Ocurre también cuando se refiere a una
interface
.
El cambio de
interface
para la
class
arregló, trabajando con y sin
@Inject
.
Otra posibilidad es no tener
emitDecoratorMetadata
establecido en true en tsconfig.json
{
"compilerOptions": {
...
"emitDecoratorMetadata": true,
...
}
}
Para mí esto fue porque dejé de usar el indicador -aot mientras intentaba acelerar el tiempo de compilación.
ng serve -aot
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.
/** 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'';
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
ImageCarouselComponent.service.ts
para que no se mezcle con mis otros servicios.
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 post destaca las dificultades que la rodean.
Por lo tanto, tengo las siguientes recomendaciones:
- Si cree que las clases interactúan con demasiada frecuencia (estoy hablando de la envidia de las características ), puede considerar fusionar los 2 servicios en 1 clase .
-
Si lo anterior no funciona para usted, considere usar un
tercer servicio
(un
EventService
) que ambos servicios pueden inyectar para intercambiar mensajes.
para mí fue solo falta de
()
en @Injectable.
Proper is @Injectable ()
EQUIVOCADO # 1: Olvidando al decorador:
//Uncaught Error: Can''t resolve all parameters for MyFooService: (?).
export class MyFooService { ... }
INCORRECTO # 2: Omitiendo el símbolo "@":
//Uncaught Error: Can''t resolve all parameters for MyFooService: (?).
Injectable()
export class MyFooService { ... }
INCORRECTO # 3: Omitiendo 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 {Inyectable} desde ''@ angular / core'';
//Uncaught ReferenceError: Injectable is not defined
@Injectable
export class MyFooService { ... }
CORRECTO:
@Injectable()
export class MyFooService { ... }