无法在angular4中注入依赖注入
Not able to inject Dependency Injection in angular4
我有一个关注者 class 像这样
import { Injectable, Inject } from '@angular/core';
@Injectable()
export class moviindustry {
constructor(private music:musicindustry) { }
producer() {
this.music.album();
alert('moviindustry producer');
}
directort() {
alert('moviindustry directort');
}
crew() {
alert('moviindustry crew');
}
}
export class musicindustry {
album() {
alert('album')
}
}
并且我已经像这样在 NgModule 中注册了 class
@NgModule({
declarations: [
AppComponent,
ComponentAComponent
],
imports: [
BrowserModule,
HttpModule
],
providers: [
moviindustry,
musicindustry
],
bootstrap: [AppComponent]
})
export class AppModule { }
现在,当我尝试像这样访问 class 时
export class AppComponent {
constructor(private movies:moviindustry){
this.movies.producer();
}
}
我收到以下错误
Uncaught Error: Can't resolve all parameters for moviindustry: (?).
at syntaxError (compiler.es5.js:1694)
根据文档,Injectable() 用于为 class 注入依赖注入,那么为什么我不能使用它?具有讽刺意味的是,当我在构造函数中使用 http 时,我的应用程序被编译了,有人可以帮助我理解这个吗
注意:
我也不会这样用
constructor(@Inject(musicindustry) private music:musicindustry) { }
您的代码存在一些严重问题。根据 Angular Style Guide.
根本不是这样
它打破了很多规则,比如单一责任主体; 服务名称 Class 应采用 UpperCamelCase 等形式。
以下是适当重构代码以使其正常工作的方法:
为这两个服务创建两个不同的文件:
电影服务:
import { Injectable } from '@angular/core';
import { MusicService } from './music.service';
@Injectable()
export class MovieService {
constructor(private music: MusicService) { }
producer() {
this.music.album();
alert('moviindustry producer');
}
directort() {
alert('moviindustry directort');
}
crew() {
alert('moviindustry crew');
}
}
音乐服务:
import { Injectable } from '@angular/core';
@Injectable()
export class MusicService {
album() {
alert('album')
}
}
这里有一个 Working Sample StackBlitz 供您参考。
将musicindustry
class移动到moviindustry
class上方,以便更好地解决moviindustry
class的依赖关系。即使您没有 DI,也最好为提供者添加 @Injectable()
装饰器。
import { Injectable, Inject } from '@angular/core';
@Injectable()
export class musicindustry {
album() {
alert('album')
}
}
@Injectable()
export class moviindustry {
constructor(private music:musicindustry) { }
producer() {
this.music.album();
alert('moviindustry producer');
}
directort() {
alert('moviindustry directort');
}
crew() {
alert('moviindustry crew');
}
}
我有一个关注者 class 像这样
import { Injectable, Inject } from '@angular/core';
@Injectable()
export class moviindustry {
constructor(private music:musicindustry) { }
producer() {
this.music.album();
alert('moviindustry producer');
}
directort() {
alert('moviindustry directort');
}
crew() {
alert('moviindustry crew');
}
}
export class musicindustry {
album() {
alert('album')
}
}
并且我已经像这样在 NgModule 中注册了 class
@NgModule({
declarations: [
AppComponent,
ComponentAComponent
],
imports: [
BrowserModule,
HttpModule
],
providers: [
moviindustry,
musicindustry
],
bootstrap: [AppComponent]
})
export class AppModule { }
现在,当我尝试像这样访问 class 时
export class AppComponent {
constructor(private movies:moviindustry){
this.movies.producer();
}
}
我收到以下错误
Uncaught Error: Can't resolve all parameters for moviindustry: (?). at syntaxError (compiler.es5.js:1694)
根据文档,Injectable() 用于为 class 注入依赖注入,那么为什么我不能使用它?具有讽刺意味的是,当我在构造函数中使用 http 时,我的应用程序被编译了,有人可以帮助我理解这个吗
注意:
我也不会这样用
constructor(@Inject(musicindustry) private music:musicindustry) { }
您的代码存在一些严重问题。根据 Angular Style Guide.
根本不是这样它打破了很多规则,比如单一责任主体; 服务名称 Class 应采用 UpperCamelCase 等形式。
以下是适当重构代码以使其正常工作的方法:
为这两个服务创建两个不同的文件:
电影服务:
import { Injectable } from '@angular/core';
import { MusicService } from './music.service';
@Injectable()
export class MovieService {
constructor(private music: MusicService) { }
producer() {
this.music.album();
alert('moviindustry producer');
}
directort() {
alert('moviindustry directort');
}
crew() {
alert('moviindustry crew');
}
}
音乐服务:
import { Injectable } from '@angular/core';
@Injectable()
export class MusicService {
album() {
alert('album')
}
}
这里有一个 Working Sample StackBlitz 供您参考。
将musicindustry
class移动到moviindustry
class上方,以便更好地解决moviindustry
class的依赖关系。即使您没有 DI,也最好为提供者添加 @Injectable()
装饰器。
import { Injectable, Inject } from '@angular/core';
@Injectable()
export class musicindustry {
album() {
alert('album')
}
}
@Injectable()
export class moviindustry {
constructor(private music:musicindustry) { }
producer() {
this.music.album();
alert('moviindustry producer');
}
directort() {
alert('moviindustry directort');
}
crew() {
alert('moviindustry crew');
}
}