Невозможно ввести зависимую инъекцию в angular4 - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий класс, как этот

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, как это

@NgModule({
  declarations: [
    AppComponent,
    ComponentAComponent
  ],
  imports: [
    BrowserModule,
    HttpModule
  ],
  providers: [  
    moviindustry,
    musicindustry
  ],  
  bootstrap: [AppComponent]
})
export class AppModule { }

теперь, когда я пытаюсь получить доступ к классу, как это

export class AppComponent {   
  constructor(private movies:moviindustry){
    this.movies.producer();    
  }
}

Я получаю следующую ошибку

Uncaught Error: Невозможно разрешить все параметры для moviindustry: (?).в syntaxError (compiler.es5.js: 1694)

согласно документации, Injectable () используется для внедрения внедрения зависимостей для класса, тогда почему я не могу его использовать?по иронии судьбы, мое приложение компилируется, когда я использую http в конструкторе, может кто-нибудь помочь мне понять это

ПРИМЕЧАНИЕ:

я не могу использовать как этолибо

constructor(@Inject(musicindustry) private music:musicindustry) { }

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Переместите musicindustry класс выше moviindustry класса, так что зависимости для класса moviindustry решаются лучше.Также идеально добавить декоратор @Injectable() для провайдеров, даже если у вас нет DI.

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');
    }
}
0 голосов
/ 29 ноября 2018

Есть серьезная проблема с вашим кодом.Это совсем не так согласно Angular Style Guide .

. Здесь нарушается множество правил, таких как Принцип единой ответственности ; имя класса обслуживания должно быть в 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')
  }

}

Вот Рабочий образец StackBlitz для вашей ссылки.

...