在模型 class 中使用具有多个内部依赖项的 Angular 服务
Using Angular Service with multiple internal dependencies in a model class
我有一个模型 class,它的构造函数中有一个参数 "id",但标题在不同服务的地图中。让我们称之为名称服务。我想在创建新实例时设置项目的标题。以下方法将不起作用 Item is not an angular class.
export class Item {
id: string;
title: string;
constructor(id: string, private nameService: NameService) {
this.id = id;
this.title = nameService.nameDictionary[id];
}
}
我可以在构造函数中传递服务实例,但我不知道该怎么做,因为 class 项目正在从许多地方使用,我不想传递 NameService object构造函数。
NameService 也有几个内部依赖项。
@Injectable({
providedIn: 'root'
})
export class NameService {
nameDictionary: any = {};
constructor(private config, private lib: LibraryService, private util: UtilityService) {
}
}
任何人都可以指导我如何在 Item Class 实例化上设置 NameService 的标题字段?
谢谢
创建新实例时只需传递标题即可 class 您也可以设置默认为空的标题。
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 的根注入器的引用,并在您的 class 中访问它。用它来访问您的 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
未定义,这是因为此 class 在模块完成初始化之前初始化。解决这个问题是将这段代码包装在 setTimeout 中。
setTimeout(() => {
if (ApplicationInjector) {
let nameService: NameService = ApplicationInjector.get(NameService);
this.name = nameService.title;
}
}, 0);
我有一个模型 class,它的构造函数中有一个参数 "id",但标题在不同服务的地图中。让我们称之为名称服务。我想在创建新实例时设置项目的标题。以下方法将不起作用 Item is not an angular class.
export class Item {
id: string;
title: string;
constructor(id: string, private nameService: NameService) {
this.id = id;
this.title = nameService.nameDictionary[id];
}
}
我可以在构造函数中传递服务实例,但我不知道该怎么做,因为 class 项目正在从许多地方使用,我不想传递 NameService object构造函数。
NameService 也有几个内部依赖项。
@Injectable({
providedIn: 'root'
})
export class NameService {
nameDictionary: any = {};
constructor(private config, private lib: LibraryService, private util: UtilityService) {
}
}
任何人都可以指导我如何在 Item Class 实例化上设置 NameService 的标题字段? 谢谢
创建新实例时只需传递标题即可 class 您也可以设置默认为空的标题。
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 的根注入器的引用,并在您的 class 中访问它。用它来访问您的 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
未定义,这是因为此 class 在模块完成初始化之前初始化。解决这个问题是将这段代码包装在 setTimeout 中。
setTimeout(() => {
if (ApplicationInjector) {
let nameService: NameService = ApplicationInjector.get(NameService);
this.name = nameService.title;
}
}, 0);