Estou com um problema ao carregar uma classe em um componente Angular. Eu tenho tentado resolvê-lo por um longo tempo; Eu até tentei juntar tudo isso em um único arquivo. O que eu tenho é:
Application.ts
/// <reference path="../typings/angular2/angular2.d.ts" />
import {Component,View,bootstrap,NgFor} from "angular2/angular2";
import {NameService} from "./services/NameService";
@Component({
selector:'my-app',
injectables: [NameService]
})
@View({
template:'<h1>Hi {{name}}</h1>' +
'<p>Friends</p>' +
'<ul>' +
' <li *ng-for="#name of names">{{name}}</li>' +
'</ul>',
directives:[NgFor]
})
class MyAppComponent
{
name:string;
names:Array<string>;
constructor(nameService:NameService)
{
this.name = 'Michal';
this.names = nameService.getNames();
}
}
bootstrap(MyAppComponent);
services / NameService.ts
export class NameService {
names: Array<string>;
constructor() {
this.names = ["Alice", "Aarav", "Martín", "Shannon", "Ariana", "Kai"];
}
getNames()
{
return this.names;
}
}
Continuo recebendo uma mensagem de erro dizendo No provider for NameService
.
Alguém pode me ajudar a identificar o problema com meu código?
typescript
angular
systemjs
M.Svrcek
fonte
fonte
Respostas:
Você tem que usar em
providers
vez deinjectables
Exemplo de código completo aqui .
fonte
providers
trabalhos na versão beta mais recente (beta 0).bindings
No Angular 2, existem três lugares em que você pode "fornecer" serviços:
"A opção do provedor de auto-inicialização destina-se à configuração e substituição dos serviços pré-registrados da Angular, como seu suporte a roteamento." - referência
Se você deseja apenas uma instância do NameService em todo o aplicativo (por exemplo, Singleton), inclua-a na
providers
matriz do componente raiz:Plunker
Se você preferir ter uma instância por componente, use a
providers
matriz no objeto de configuração do componente:Consulte o documento Injetores hierárquicos para obter mais informações.
fonte
A partir do Angular 2 Beta:
Adicione
@Injectable
ao seu serviço como:e à sua configuração de componente, adicione o seguinte
providers
:fonte
Você deve estar injetando
NameService
dentroproviders
variedade de seuAppModule
'sNgModule
metadados.Se você deseja criar uma Dependência para um determinado nível de componente sem se preocupar com o estado do seu aplicativo, pode injetar essa dependência na
providers
opção de metadados do componente, como a resposta aceita do @Klass mostrada.fonte
DataManagerService
tem@Injectable
decorador sobre ele?Surpreendentemente, a sintaxe mudou mais uma vez na versão mais recente do Angular :-) Dos documentos do Angular 6 :
src / app / user.service.0.ts
fonte
Você deve injetar NameService na matriz de provedores dos metadados NgModule do AppModule.
e certifique-se de importar seu componente pelo mesmo nome (diferencia maiúsculas de minúsculas), pois SystemJs diferencia maiúsculas de minúsculas (por design). Se você usar um nome de caminho diferente nos arquivos do seu projeto, como este:
main.module.ts
your-component.ts
o System js fará importações duplas
fonte
No Angular v2 e acima, é agora:
@Component({ selector:'my-app', providers: [NameService], template: ... })
fonte
O Angular 2 mudou. Aqui está a aparência da parte superior do seu código:
Além disso, convém usar getters e setters em seu serviço:
Em seu aplicativo, você pode simplesmente:
Sugiro que você vá ao plnkr.co e crie um novo plunk Angular 2 (ES6) e faça com que ele funcione primeiro. Isso configurará tudo para você. Quando estiver funcionando, copie-o para o seu outro ambiente e trie todos os problemas desse ambiente.
fonte
O erro
No provider for NameService
é um problema comum que muitos iniciantes do Angular2 enfrentam.Motivo : antes de usar qualquer serviço personalizado, primeiro é necessário registrá-lo no NgModule, adicionando-o à lista de provedores:
Solução:
fonte
Você também pode ter as dependências declaradas no comando bootstrap como:
Pelo menos foi o que funcionou para mim no alpha40.
este é o link: http://www.syntaxsuccess.com/viewarticle/dependency-injection-in-angular-2.0
fonte
Olá, Você pode usar isso no seu arquivo .ts:
primeiro importe seu serviço neste arquivo .ts:
Em seguida, no mesmo arquivo, você pode adicionar
providers: [Your_Service_Name]
:fonte
Adicione a provedores não injetáveis
fonte
No Angular, você pode registrar um serviço de duas maneiras:
1. Registre um serviço no módulo ou componente raiz
Efeitos:
Você deve tomar cuidado ao registrar um serviço em um módulo carregado lento:
O serviço está disponível apenas em componentes declarados nesse módulo
O serviço estará disponível no aplicativo vitalício apenas quando o módulo for carregado
2. Registre um serviço em qualquer outro componente de aplicativo
Efeitos:
Você deve tomar cuidado se registrar um serviço em qualquer outro componente do aplicativo
A instância do serviço injetado estará disponível apenas no componente e em todos os seus filhos.
A instância estará disponível no tempo de vida do componente.
fonte
Você precisa adicioná-lo à matriz de fornecedores, que inclui toda a dependência do seu componente.
Veja esta seção na documentação angular:
Portanto, no seu caso, basta alterar os injetáveis para fornecedores como abaixo:
Também nas novas versões do Angular, o @View e alguns outros itens já foram.
Para mais informações, visite aqui .
fonte
adicione seu serviço à matriz de provedores [] no arquivo app.module.ts. Como abaixo
// aqui meu serviço é CarService
app.module.ts
fonte
Angular2 requer que você declare todos os injetáveis na chamada de função de inicialização. Sem isso, seu serviço não é um objeto injetável.
fonte
providers
matriz no objeto de configuração do componente. Se estiver incluído naproviders
matriz, obteremos uma instância por componente vinculado. Consulte o documento Injetores hierárquicos para obter mais informações.Adicione @Injectable ao seu serviço como:
e no seu componente adicione os provedores como:
ou se você deseja acessar seu serviço em todo o aplicativo, pode passar no provedor de aplicativos
fonte
Registrando provedores em um componente
Aqui está um HeroesComponent revisado que registra o HeroService em sua matriz de provedores.
fonte