我在加载一个类到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);

服务/ NameService.ts

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

我一直得到一个错误消息说没有NameService的提供者。

有人能帮我找出我的代码的问题吗?


当前回答

在Angular中,你可以用两种方式注册服务:

1. 在模块或根组件中注册服务

效果:

可用于所有组件 适用于终身应用

如果你将一个服务注册到一个惰性加载模块中,你应该注意:

该服务仅可用于该模块中声明的组件 只有当模块被加载时,该服务才在生命周期应用程序中可用

2. 将服务注册到任何其他应用程序组件

效果:

是否将服务的单独实例注入到组件中

如果将服务注册到任何其他应用程序组件中,您应该小心

注入服务的实例将仅对组件及其所有子组件可用。 该实例将在组件的生命周期内可用。

其他回答

在Angular中,你可以用两种方式注册服务:

1. 在模块或根组件中注册服务

效果:

可用于所有组件 适用于终身应用

如果你将一个服务注册到一个惰性加载模块中,你应该注意:

该服务仅可用于该模块中声明的组件 只有当模块被加载时,该服务才在生命周期应用程序中可用

2. 将服务注册到任何其他应用程序组件

效果:

是否将服务的单独实例注入到组件中

如果将服务注册到任何其他应用程序组件中,您应该小心

注入服务的实例将仅对组件及其所有子组件可用。 该实例将在组件的生命周期内可用。

在app.module.ts文件中将服务添加到providers[]数组中。 像下面的

//这里我的服务是CarService

app.module.ts

import {CarsService} from './cars.service';

providers: [CarsService] // you can include as many services you have 

令人震惊的是,在Angular的最新版本中,语法又发生了变化:-)

从Angular 6.0开始,创建单例对象的首选方式 服务是在服务上指定应该在哪个服务中提供服务 应用程序根目录。这可以通过将providedIn设置为root on来实现 服务的@Injectable装饰器:

src / app /用户服务。0。注意事项

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

@Injectable({
  providedIn: 'root',
})
export class UserService {
}

你也可以在bootstrap命令中声明依赖项:

bootstrap(MyAppComponent,[NameService]);

至少这是我在alpha40中使用的方法。

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

您必须使用提供程序而不是注入程序

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

完整的代码示例。