4

我在 Angular2 (2.0.0-beta.0) 应用程序中定义了一项服务。是这样的:

import {Injectable} from "angular2/core";

@Injectable()
export class MyService {
    constructor() {

    }

    getSomething() {
        return 'something';
    }
}

我将它列在我的主应用程序文件的 bootstrap() 函数中,以便它通常可用于我的代码:

bootstrap(App, [MyService, SomeOtherService, ROUTER_DIRECTIVES[);

有时我无法在组件中使用该服务,即使我myService:MyService在组件constructor()功能中有类似的东西,如下所示:

import {MyService} from '../services/my.service';

@Component({
    selector: 'my-component',
    directives: [],
    providers: [],
    pipes: [],
    template: `
    <div><button (click)="doStuff()">Click Me!</button></div>
    `
})
export MyComponent {
    constructor(myService:MyService) {} // note the private keyword

    doStuff() {
        return this.myService.getSomething();
    }
}

在其他地方它工作正常。在它不起作用的地方,如果我尝试访问它,我会收到一条消息:

EXCEPTION: TypeError: Cannot read property 'getSomething' of undefined

这基本上意味着服务没有被注入。

是什么导致它无法注入?

4

2 回答 2

12

这种行为是完全正常的。

在组件的构造方法中,当您不添加privatepublic关键字时,myService变量被评估为局部变量,因此它在方法调用结束时被销毁。

当您添加privatepublic关键字时,TypeScript 会将变量添加到类属性中,以便您以后可以使用关键字调用该属性。

constructor(myService: MyService) {
  alert(myService.getSomething());
  // This will works because 'myService', is declared as an argument
  // of the 'constructor' method.
}

doStuff() {
  return (this.myService.getSomething());
  // This will not works because 'myService' variable is a local variable
  // of the 'constructor' method, so it's not defined here.
}
于 2015-12-18T22:05:59.670 回答
10

private问题在于,除非您在构造函数中将注入的对象标记为or ,否则依赖注入似乎不起作用public

在我的组件的构造函数中的服务注入前面添加这两个东西中的任何一个使它工作正常:

import {MyService} from '../services/my.service';

@Component({
    selector: 'my-component',
    directives: [],
    providers: [],
    pipes: [],
    template: `
    <div><button (click)="doStuff()">Click Me!</button></div>
    `
})
export MyComponent {
    constructor(private myService:MyService) {} // note the private keyword

    doStuff() {
        return this.myService.getSomething();
    }
}
于 2015-12-18T20:44:13.217 回答