у меня есть класс модели, который принимает один аргумент "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 при создании экземпляра класса элемента? Спасибо
Просто передайте заголовок при создании нового экземпляра класса, также вы можете установить заголовок с нулевым значением по умолчанию.
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)
}
}
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, отлично!
Я понял вашу точку зрения, но код структурирован таким образом, что я не могу передать заголовок конструктору, каким-то образом я хочу внедрить службу в класс элементов.