Внедрение зависимости - Как сделать класс динамическим в конструкторе службы в Angular 8? - PullRequest
0 голосов
/ 09 января 2020

Я пытался найти решение, но мои знания DI в сфере услуг все еще слишком малы, чтобы заставить эту вещь работать - поэтому мне интересно, есть ли способ заставить эту работу вообще?

Мой setup: у меня есть общий Downloadservice, который получает данные от другого сервиса, а затем предоставляет ссылку для загрузки большого двоичного объекта в виде файла PDF. Мой код работает нормально, когда я внедряю только один источник, но я хочу сделать следующее: служба загрузки должна быть обобщенной c в зависимости от того, какой компонент требует своей функции. Это означает, что передаваемые данные в его конструкторе должны быть динамически.

Это фрагмент моего кода:

constructor(private dataservice: MusicService) { }

  onDownload() {
    this.dataservice.getDownloadData().subscribe(
    (data) => {
      const fileName = 'Report.pdf';
      const blob = new Blob([data], { type: 'application/pdf' });
      if (navigator.msSaveBlob) { // IE 10+
        navigator.msSaveBlob(blob, fileName);
        } else {
          const link = document.createElement('a');
          if (link.download !== undefined) {
            const url = URL.createObjectURL(blob);
            link.setAttribute('href', url);
            link.setAttribute('download', fileName);
            link.style.visibility = 'hidden';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
          }
        }
      }
    );
  }

Все мои сервисы, которые будут внедрены, имеют getDownloadData ( ) -метод. Таким образом, единственная строка, которую я должен сделать динамически, это:

constructor(private dataservice: MusicService) { }

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 09 января 2020

Если у вас есть GeneralService

dataService:any=null
getData()
{
   this.dataService?return this.http.get(...):of(null)
}

Вы можете иметь в компоненте

constructor(private musicService:MusicService,private generalService:GeneralService){
   this.generalService.dataService=this.MusicService
}
ngOnInit()
{
 this.generalService.getData().subscribe(...)
}
...