我在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
这基本上意味着没有注入服务。
是什么导致它不被注射?
答案 0 :(得分:12)
这种行为完全正常。
在您未添加 私有 或 公开 关键字的组件的构造函数方法中 myService 变量被评估为局部变量,因此在方法调用结束时将其销毁。
当您添加 私有 或 public 关键字时,TypeScript会将该变量添加到class属性中,因此您可以稍后使用 此 关键字调用该媒体资源。
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.
}
答案 1 :(得分:8)
问题是,除非您在构造函数中将注入的对象标记为private
或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();
}
}