Angular没有NameService的提供者

M.S*_*cek 302 typescript systemjs angular

我在将类加载到Angular组件时遇到了问题.我一直试图解决它很长一段时间; 我甚至尝试在一个文件中加入它.我有的是:

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);
Run Code Online (Sandbox Code Playgroud)

服务/ NameService.ts

export class NameService {
    names: Array<string>;
    constructor() {
        this.names = ["Alice", "Aarav", "Martín", "Shannon", "Ariana", "Kai"];
    }
    getNames()
    {
        return this.names;
    }
}
Run Code Online (Sandbox Code Playgroud)

我一直收到一条错误信息No provider for NameService.

有人可以帮助我发现我的代码问题吗?

Kla*_*urn 445

你必须使用providers而不是injectables

@Component({
    selector: 'my-app',
    providers: [NameService]
})
Run Code Online (Sandbox Code Playgroud)

这里填写代码示例.

  • @unobf导入语句对我来说不会受到损害.对于angular2库的较旧alpha,上一个答案可能正确.原始指南是指alpha-28,我使用alpha 35.另外,我提供了一个完整代码示例的链接,所以我想我提供了很多信息. (7认同)
  • 此答案不包括修复损坏的import语句所需的更改.另外,为什么你不只是更新6月1日(当问到这个问题时)接受的现有答案而不是创建一个新的部分答案? (3认同)
  • 未来googlers的更新:使用`providers`可以使用最新的beta(beta 0). (3认同)

Mar*_*cok 77

在Angular 2中,有三个地方可以"提供"服务:

  1. 引导
  2. 根组件
  3. 其他组件或指令

"引导程序提供程序选项用于配置和覆盖Angular自己的预注册服务,例如其路由支持." - 参考

如果您只想在整个应用程序中使用一个NameService实例(即Singleton),那么将其包含在providers根组件的数组中:

@Component({
   providers: [NameService],
   ...
)}
export class AppComponent { ... }
Run Code Online (Sandbox Code Playgroud)

Plunker

如果您希望每个组件只有一个实例,请使用providers组件配置对象中的数组:

@Component({
   providers: [NameService],
   ...
)}
export class SomeOtherComponentOrDirective { ... }
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Hierarchical Injectors doc.

  • 这是一个非常好的答案.它进一步解释了在根组件中声明服务与在其他子组件中声明之间的区别. (4认同)

mag*_*ter 33

截至Angular 2 Beta:

添加@Injectable到您的服务:

@Injectable()
export class NameService {
    names: Array<string>;

    constructor() {
        this.names = ["Alice", "Aarav", "Martín", "Shannon", "Ariana", "Kai"];
    }

    getNames() {
        return this.names;
    }
}
Run Code Online (Sandbox Code Playgroud)

并为您的组件配置添加providersas:

@Component({
    selector: 'my-app',
    providers: [NameService]
})
Run Code Online (Sandbox Code Playgroud)


Pan*_*kar 21

你应该注入你的元数据的NameService内部providers数组.AppModuleNgModule

@NgModule({
   imports: [BrowserModule, ...],
   declarations: [...],
   bootstrap: [AppComponent],
   //inject providers below if you want single instance to be share amongst app
   providers: [MyService]
})
export class AppModule {

}
Run Code Online (Sandbox Code Playgroud)

如果要在不打扰应用程序状态的情况下为特定组件级别创建依赖关系,则可以在组件providers元数据选项上注入该依赖关系,如所显示的已接受的@Klass答案.


sag*_*aei 13

您应该在AppModule的NgModule元数据的providers数组中注入NameService.

@NgModule({
   providers: [MyService]
})
Run Code Online (Sandbox Code Playgroud)

并确保使用相同名称(区分大小写)在组件中导入,因为SystemJs区分大小写(按设计).如果在项目文件中使用不同的路径名,如下所示:

main.module.ts

import { MyService } from './MyService';
Run Code Online (Sandbox Code Playgroud)

您-component.ts

import { MyService } from './Myservice';
Run Code Online (Sandbox Code Playgroud)

然后系统js将进行双重导入


sup*_*bra 12

在Angular v2及以上它现在是:

@Component({ selector:'my-app', providers: [NameService], template: ... })


Der*_*ler 12

令人震惊的是,语法在最新版本的Angular中再次发生了变化:-)来自Angular 6文档:

从Angular 6.0开始,创建单例服务的首选方法是在服务上指定应在应用程序根目录中提供它.这是通过在服务的@Injectable装饰器上将provideIn设置为root来完成的:

SRC /应用程序/ user.service.0.ts

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

@Injectable({
  providedIn: 'root',
})
export class UserService {
}
Run Code Online (Sandbox Code Playgroud)


uno*_*obf 7

Angular 2已经改变了,这里代码的顶部应该是这样的:

import {
  ComponentAnnotation as Component,
  ViewAnnotation as View, bootstrap
} from 'angular2/angular2';
import {NameService} from "./services/NameService";

@Component({
  selector: 'app',
  appInjector: [NameService]
})
Run Code Online (Sandbox Code Playgroud)

此外,您可能希望在服务中使用getter和setter:

export class NameService {
    _names: Array<string>;
    constructor() {
        this._names = ["Alice", "Aarav", "Martín", "Shannon", "Ariana", "Kai"];
    }
    get names() {
        return this._names;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的应用程序中,您可以做到:

this.names = nameService.names;
Run Code Online (Sandbox Code Playgroud)

我建议你去plnkr.co并创建一个新的Angular 2(ES6)插件并让它首先在那里工作.它将为您设置一切.一旦它在那里工作,将其复制到您的其他环境并对该环境的任何问题进行分类.


小智 6

错误No provider for NameService是许多Angular2初学者面临的常见问题.

原因:在使用任何自定义服务之前,首先必须通过将其添加到提供者列表中将其注册到NgModule:

解:

@NgModule({
    imports: [...],
    providers: [CustomServiceName]
})
Run Code Online (Sandbox Code Playgroud)


Tob*_*ann 5

您还可以在bootstrap-command中声明依赖项,如:

bootstrap(MyAppComponent,[NameService]);
Run Code Online (Sandbox Code Playgroud)

至少那是在alpha40中对我有用的东西.

这是链接:http://www.syntaxsuccess.com/viewarticle/dependency-injection-in-angular-2.0