Criei um aplicativo básico no Angular 2, mas encontrei um problema estranho no qual não posso injetar um serviço em um dos meus componentes. No entanto, ele injeta bem em qualquer um dos outros três componentes que criei.
Para iniciantes, este é o serviço:
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;
}
}
E o componente com o qual se recusa a trabalhar:
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);
}
}
O erro que recebo no console do navegador é o seguinte:
EXCEÇÃO: Não é possível resolver todos os parâmetros para HeaderComponent: (?).
Eu tenho o serviço na função de inicialização, para que ele tenha um provedor. E eu pareço capaz de injetá-lo no construtor de qualquer um dos meus outros componentes sem problemas.
angular
angular2-di
Keith Otto
fonte
fonte
'../'
umindex.ts
(barril)? Você pode tentar importá-lo do arquivo em que é declarado diretamente?Respostas:
Importe-o do arquivo em que é declarado diretamente em vez do barril.
Não sei o que exatamente causa o problema, mas o vi mencionado várias vezes (provavelmente algum tipo de dependência circular).
Também deve ser corrigível alterando a ordem das exportações no barril (não sabe detalhes, mas também foi mencionado)
fonte
2.0.2
). Acho que os barris ainda são úteis, principalmente quando preciso importar vários modelos e serviços entre diferentes módulos. Estaimport { cleanValues, getState, FirebaseService, NotificationService, ... } from '../../shared/services';
foi uma dor quando não funcionou (;NgModule
há ajuda com serviços únicos ...Além das respostas anteriores, parece que esse erro também é gerado quando o serviço injetável está faltando no
@Injectable()
decorador real . Portanto, antes de depurar o item de dependência cíclica e a ordem de suas importações / exportações, faça uma verificação simples se seu serviço realmente foi@Injectable()
definido.Isso se aplica ao Angular atual mais recente, o Angular 2.1.0.
Abri uma questão sobre esse assunto .
fonte
Router
'@ angular / router' e sem esse injetável, esse erro sempre ocorrerá (assim que você decidir criar uma linha de código usar esse roteador injetado.@injectable()
não é necessária. O que é outra singularidade em si. Por uma boa medida, ainda o adicionaria, simplesmente para quando você decidir injetar alguma coisa.A partir do Angular
2.2.3
, agora existe umaforwardRef()
função de utilitário que permite injetar provedores que ainda não foram definidos.Por não definido, quero dizer que o mapa de injeção de dependência não conhece o identificador. É o que acontece durante dependências circulares. Você pode ter dependências circulares no Angular que são muito difíceis de desembaraçar e ver.
A adição
@Inject(forwardRef(() => MobileService))
ao parâmetro do construtor no código-fonte da pergunta original corrigirá o problema.Referências
Manual do Angular 2: ForwardRef
Encaminhar referências no Angular 2
fonte
forwardRef()
já existia em alpha ;-) Só é necessário se oMobile
serviço for declarado mais abaixo no mesmo arquivo. Se as aulas estiverem em arquivos diferentes, não há necessidade deforwardRef()
forwardRef()
, ajudou a me livrar daCan't resolve all parameters for ...
mensagem. Pelo menos o componente está funcionando enquanto estou procurando uma solução melhor para o problema. (E sim, a dependência não é importado diretamente do seu arquivo)forwardRef
. É muito difícil de encontrar. Ontem me levou o dia inteiro para resolver esse problema.foreardRef
mim mesmo, mas não mais depois de terNgModule
sido introduzida. Não estou preocupado em perder representantes. Só estou curioso por que você se deparou com isso depois que isso não apareceu mais desde alguns meses. Vou dar uma olhada mais de perto quando voltar para casa em alguns dias. Muito obrigado pelo feedback.ERRO # 1: Esquecendo o Decorador:
ERRO # 2: Omitindo o símbolo "@":
ERRADO # 3: Omitindo símbolos "()":
ERRADO # 4: "i" minúsculo:
ERRO # 5: Você esqueceu: importar {Injetável} de '@ angular / core';
CORRIGIR:
fonte
Como já foi dito, o problema é causado pelo pedido de exportação dentro do barril, causado por dependências circulares.
Uma explicação mais detalhada está aqui: https://stackoverflow.com/a/37907696/893630
fonte
Eu também encontrei isso injetando o serviço A no serviço B e vice-versa.
Eu acho que é bom que isso falhe rápido, pois provavelmente deve ser evitado de qualquer maneira . Se você deseja que seus serviços sejam mais modulares e reutilizáveis, é melhor evitar referências circulares o máximo possível. Este post destaca as armadilhas que cercam isso.
Portanto, tenho as seguintes recomendações:
EventService
), que ambos os serviços podem injetar para trocar mensagens.fonte
Para o benefício dos pesquisadores; Eu recebi esse erro. Era simplesmente um símbolo @ ausente.
Ou seja, isso produz o
Can't resolve all parameters for MyHttpService
erro.A adição do
@
símbolo ausente o corrige.fonte
No meu caso, eu precisava adicionar
import "core-js/es7/reflect";
ao meu aplicativo para fazer o@Injectable
trabalho.fonte
Outra possibilidade é não ter
emitDecoratorMetadata
definido como true no tsconfig.jsonfonte
Você recebe esse erro se tiver o serviço A que depende de uma propriedade estática / método de serviço B e o próprio serviço B depende do serviço A através da injeção de dependência. Portanto, é um tipo de dependência circular, embora não seja porque a propriedade / método é estático. Provavelmente um bug que ocorre em combinação com o AOT .
fonte
A -> B
e os dois estavam usando a mesma classe estática. A soluçãoforwardRef
ajuda, mas vou ver como isso pode ser resolvido. Provavelmente tentarei fazer um serviço real dessa classe estática (isso também levará a um design melhor).Além do
@Injectable()
decorador ausenteO
@Injectable()
decorador ausente na classe abstrata produziu o item Não é possível resolver todos os parâmetros de serviço: (?) O decorador precisa estar presente naMyService
classe derivada e na classe derivadaBaseService
fonte
No meu caso, aconteceu porque não declarei o tipo para um parâmetro do construtor.
Eu tinha algo parecido com isto:
e alterá-lo para o código abaixo resolveu meu problema.
fonte
para mim, foi apenas a falta do
()
@Injectable. Adequado é @Injectable ()fonte
A remoção de parâmetros do método injetável constructor () resolveu o problema para o meu caso.
fonte
No meu caso, foi por causa do plugin Augury, desativá-lo funcionará bem. Opção alternativa é aot, também funciona.
todos os créditos para @ Boboss74, ele postou a resposta aqui: https://github.com/angular/angular/issues/23958
fonte
Bem, para mim, o problema era ainda mais irritante, eu estava usando um serviço dentro de um serviço e esqueci de adicioná-lo como dependência no appModule! Espero que isso ajude alguém a economizar várias horas quebrando o aplicativo apenas para construí-lo novamente
fonte
@Inject
anotação. Eu estava ignorando exatamente o que a mensagem de erro diz um pouco. Se você não suspeitar de dependências circulares, vá para a classe mencionada no erro e veja todos os parâmetros do construtor e todos os membros da classe anotados@Inject
e verifique se você está executando o DI corretamente em todos eles. Mais sobre o DI aqui: angular.io/docs/ts/latest/guide/dependency-injection.htmlVocê precisa adicionar uma matriz de provedores no decorador @Component ou no módulo em que seu componente é declarado. Componente interno, você pode fazer o seguinte:
fonte
No meu caso, passar parâmetros errados para o construtor gera esse erro, a idéia básica sobre esse erro é que você passou inadvertidamente alguns argumentos errados para qualquer função.
Resolvi isso apenas removendo esse argumento.
fonte
Para mim, recebi esse erro quando desabilitei esta importação por engano no arquivo polyfills.ts, é necessário garantir que ela seja importada para evitar esse erro.
fonte
No meu caso, eu estava tentando estender "
NativeDateAdapter
" para substituir "format(date: Date, displayFormat: Object)
" o método.Em AngularMaterial-2 DatePicker.
Então, basicamente, eu esqueci de adicionar
@Injectable
anotação.Depois de adicionar isso à minha classe "CustomDateAdapter":
Ocorreu um erro.
fonte
Esta resposta pode ser muito útil para esse problema. Além disso, no meu caso, exportar o serviço como
default
foi a causa.ERRADO:
CORRIGIR:
fonte
Esse pode ser um problema realmente difícil de depurar devido à falta de feedback no erro. Se você está preocupado com uma dependência cíclica real, aqui está a coisa mais importante a ser observada no rastreamento da pilha: a) o nome do serviço b) o parâmetro construtor nesse serviço que possui um ponto de interrogação, por exemplo, se estiver assim:
significa que o quinto parâmetro é um serviço que também depende do AuthService. ou seja, ponto de interrogação, significa que não foi resolvido pelo DI.
A partir daí, você só precisa dissociar os 2 serviços reestruturando o código.
fonte
Eu encontrei esse erro digitando incorretamente o nome do serviço, ou seja, construtor (private myService: MyService ).
Para serviços com erros de ortografia, consegui determinar qual serviço era o problema (eu tinha vários listados no construtor) inspecionando a página no Chrome-> Console. Você verá como parte da mensagem uma lista de array de "parâmetros" exibindo o objeto Object, objeto Object,? (ou algo assim). Observe onde o "?" é e essa é a posição do serviço que está causando o problema.
fonte
Embora a encomenda das classes exportadas de dentro de barris possa ter sido mencionada, o cenário a seguir também pode produzir o mesmo efeito.
Suponha que você tenha classes
A
,B
eC
exportadas de dentro do mesmo arquivo em queA
dependeB
eC
:Como as classes dependentes (ou seja, neste caso, classes
B
eC
) ainda não são conhecidas pelo Angular, ( provavelmente em tempo de execução durante o processo de injeção de dependência do Angular na classeA
), o erro é gerado.Solução
A solução é declarar e exportar as classes dependentes antes da classe em que o DI é feito.
ou seja, no caso acima, a classe
A
é declarada logo após a definição de suas dependências:fonte
No meu caso, eu estava exportando uma classe e um enum do mesmo arquivo de componente:
mComponent.component.ts
:Então, eu estava tentando usar
MyEnum
de um filho deMyComponentClass
. Isso estava causando o erro Não é possível resolver todos os parâmetros .Ao mover
MyEnum
uma pasta separada deMyComponentClass
, isso resolveu meu problema!Como Günter Zöchbauer mencionou, isso está acontecendo devido a um serviço ou componente ser circularmente dependente.
fonte
Se o seu serviço estiver definido no mesmo arquivo que um componente (que o consome) e o serviço for definido após o componente no arquivo, você poderá receber este erro. Isso ocorre devido ao mesmo problema 'forwardRef' mencionado por outros. No momento, o VSCode não é bom em mostrar esse erro e a compilação é compilada com êxito.
A execução da compilação
--aot
pode mascarar esse problema devido à maneira como o compilador funciona (provavelmente relacionado ao tremor da árvore).Solução: verifique se o serviço está definido em outro arquivo ou antes da definição do componente. (Não tenho certeza se o forwardRef pode ser usado nesse caso, mas parece desajeitado fazê-lo).
Se eu tiver um serviço muito simples que esteja fortemente vinculado a um componente (como um modelo de exibição) - por exemplo.
ImageCarouselComponent
, Posso citar o nomeImageCarouselComponent.service.ts
para que não se confunda com meus outros serviços.fonte
No meu caso, era uma referência circular. Eu tinha o MyService chamando Myservice2 e o MyService2 chamando MyService.
Não é bom :(
fonte
No meu caso, o motivo foi o seguinte:
Como conseqüência, ao tentar criar um objeto A, o construtor padrão falhou. Não faço ideia por que isso não foi um erro de compilação.
Para consertá-lo, basta adicionar um construtor em A, que corretamente chamou o construtor de B.
fonte
Peguei vocês!
Se nenhuma das respostas acima o ajudou, talvez você esteja importando algum elemento do mesmo arquivo em que um componente está injetando o serviço.
Eu explico melhor:
Este é o arquivo de serviço :
Este é o arquivo de componente :
Isso causa problemas, mesmo que o símbolo não esteja dentro do mesmo componente, mas apenas dentro do mesmo arquivo. Mova o símbolo (pode ser uma função, uma constante, uma classe e assim por diante ...) em outro lugar e o erro desaparecerá
fonte
para angular 6 e versões mais recentes, tente
.. logo acima da sua classe de serviço, sem outras linhas no meio
vantagens
[ documentos angulares ]
fonte