Использование службы Angular с несколькими внутренними зависимостями в классе модели

у меня есть класс модели, который принимает один аргумент "id" в своем конструкторе, но заголовок находится на карте в другом сервисе. назовем это службой имен. Я хочу установить заголовок элемента при создании нового экземпляра. следующий подход не будет работать, если Item не является угловым классом.

export class Item {
  id: string;
  title: string;

  constructor(id: string, private nameService: NameService) {
    this.id = id;
    this.title = nameService.nameDictionary[id];
  }

}

Я могу передать экземпляр службы в конструктор, но я не знаю, что делать, поскольку элемент класса используется во многих местах, и я не хочу передавать объект NameService из конструктора.

NameService также имеет несколько внутренних зависимостей.

@Injectable({
  providedIn: 'root'
})
export class NameService {

  nameDictionary: any = {};

  constructor(private config, private lib: LibraryService, private util: UtilityService) {

  }
}

Может ли кто-нибудь помочь мне, как я могу установить поле заголовка из NameService при создании экземпляра класса элемента? Спасибо

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
127
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Просто передайте заголовок при создании нового экземпляра класса, также вы можете установить заголовок с нулевым значением по умолчанию.

export class Item {

  constructor(private id: string, private title = null) {}
}

=====

@Injectable({
  providedIn: 'root'
})
export class NameService {

  nameDictionary: any = {};

  constructor(private config, private lib: LibraryService, private util: UtilityService) {

 get title(): string {
  return nameDictionary.title;
  }
}

====

@Component()
export class SomeComponent {

constructor(private service: NameService) {}

someMethod(id) {
  const model = new Item(id, this.service.title)
  }
}

Я понял вашу точку зрения, но код структурирован таким образом, что я не могу передать заголовок конструктору, каким-то образом я хочу внедрить службу в класс элементов.

Haris Jamil 23.07.2019 10:02
export class Item {
  id: string;
  title: string;

  constructor(id: string, private nameService = new NameService) {
    this.id = id;
    this.title = nameService.nameDictionary[id];
  }

}
Ответ принят как подходящий

Вы можете сохранить ссылку на корневой инжектор angular после начальной загрузки приложения и получить к нему доступ в своем классе. Используйте его, чтобы получить доступ к вашему nameService.

Simple StackBlitz demo

main.ts

export var ApplicationInjector: Injector;

platformBrowserDynamic().bootstrapModule(AppModule).then(ref => {
  ApplicationInjector = ref.injector;
}).catch(err => console.error(err));

item.ts

import { ApplicationInjector } from '../../main' // or some other path to main.ts file

export class Item {
  id: string;
  title: string;

  constructor(id: string) {
    this.id = id;
    if (ApplicationInjector) {
      let nameService: NameService = ApplicationInjector.get(NameService);
      this.name = nameService.title;
    }
  }
}

ПРИМЕЧАНИЕ. Если ApplicationInjector не определено, это связано с тем, что этот класс был инициализирован до завершения инициализации модуля. исправить это будет заключаться в том, чтобы обернуть этот код в setTimeout.

setTimeout(() => {
  if (ApplicationInjector) {
    let nameService: NameService = ApplicationInjector.get(NameService);
    this.name = nameService.title;
  }
}, 0);

Спасибо @benshabatnoam, отлично!

Haris Jamil 23.07.2019 13:54

Другие вопросы по теме