在模型 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);