Не удается разрешить все параметры для класса (?)

В настоящее время я пытаюсь создать динамическое меню в angular 9. Я новичок в angular и по какой-то причине получаю следующее сообщение об ошибке: ОШИБКА в не удается разрешить все параметры для HeadMenuComponent в C:/mypath/head-menu .component.ts: (?, ?, ?). Код довольно прост:

import { Component, OnInit, Inject, Injectable } from '@angular/core';

  @Component({
    selector: 'app-head-menu',
    templateUrl: './head-menu.component.html',
    styleUrls: ['./head-menu.component.css']
  })

  export class HeadMenuComponent implements OnInit {
    imageURL: string;
    text: string;
    menuFunction: () => void;

  constructor(@Inject(String)imageURL: string, @Inject(String)text: string, 
              @Inject(Function)functionToAccept: () => void) {
    this.imageURL = imageURL;
    this.text = text;
    this.menuFunction = functionToAccept;
   }


  ngOnInit(): void {
  }

}

Код компилируется, и ng serve будет работать, но я все еще получаю сообщение об ошибке. Это особенно важно для меня, потому что команда angular-cli: ng xi18n не запускается из-за этой ошибки.

Итак, мой вопрос: что я делаю неправильно? Есть ли другой способ передать объекты в конструктор? Мне кажется неправильным использовать угловую инъекцию, просто чтобы передать строку конструктору, но я пока не нашел другого способа.


person Erik B.    schedule 20.08.2020    source источник


Ответы (1)


Один из способов сделать это — сделать следующее:

export const IMAGE_URL = new InjectionToken<string>('imageUrl');

Затем в app.module (или где-то еще):

{
  provide: IMAGE_URL ,
  useValue: 'www.someurl.com'
}

Or

{
  provide: IMAGE_URL,
  deps: [ConfigService],   //dependencies
  useFactory: (c: ConfigService) => {
      return c.someUrlValue();
  }
}

а затем потреблять:

constructor(@Inject(IMAGE_URL) imageUrl: string) {

}
person Ric    schedule 20.08.2020
comment
конечно, вам не нужно определять его статически. provide также может принимать фабричные функции, которые также могут принимать службы и т. д., так что теоретически вы можете делать то, что хотите. я обновлю ответ с предложением - person Ric; 20.08.2020
comment
Спасибо, буду тестить. - person Erik B.; 20.08.2020
comment
ты тестил :) - person Ric; 17.09.2020
comment
К сожалению, это не сработало для меня. Я выбираю другой способ, а затем ng xi18n для реализации моего языка. Я мог бы уже закрыть этот вопрос, но, возможно, у кого-то еще такая же проблема. @Ric - person Erik B.; 18.09.2020