angular - 如何在 Angular 中使用 DI 为给定类提供实现?
问题描述
考虑到我有 2 个模块,分别称为 A 和 B。
假设我有这门课。它并不真正“属于”任何模块,因为它是一个普通的旧 Typescript 类,而不是一个Injectable.
class Greeter {
constructor(private greeting: string) {}
greet(name: string) {
console.log(`${greeting}, ${name}!`);
}
}
凉爽的。然后,假设模块 A 导出了一个注入Greeter
实例的组件。
@Component({ ... })
class GreetingComponent {
name: string;
constructor(private greeter: Greeter) {}
greet() { this.greeter.greet() }
}
好的。现在假设模块 B 有一个扩展Greeter
类的服务。模块 B 导入模块 A。
@Injectable({
providedIn: 'root'
})
class GentleGreeterService extends Greeter {
constructor() {
super('Hello');
}
greet(name: string) {
super.greet(name);
console.log('How are you doing?');
}
}
凉爽的。现在,每当我GreetingComponent
在模块 B 中使用时,我都希望GentleGreeterService
注入一个实例。但是,我根本没有得到任何实例,而是NullInjectorError: No provider for Greeter
. 我怎样才能解决这个问题?
解决方案
您应该在官方文档中阅读有关提供者的信息——我相信他们会比我解释得更好。
长话短说 - 你只有一个提供者,GentleGreeterService
但没有Greeter
。您可以添加一个提供者(即在模块级别,但也在组件级别),它将提供Greeter
但使用其他一些类(或以其他方式解决它,例如使用工厂):
providers: [{provide: Greeter, useClass: GentleGreeterService}]
推荐阅读
- sql - 在报告中汇总 NodeID 总数
- bash - 将基于其他列的时间戳列添加到 CSV(使用 bash)
- java - 读出是否在其他控制器中选择了 RadioButton
- vba - 将 +2 添加到任何数字 (VBA)
- python - Python Flask:检查了单选选项的 Post 方法的错误请求
- c# - 通过 C# 在 QuickBooks 中创建新项目
- mysql - MySql GROUP BY 时间戳间隔,其中间隔已过
- python - 在熊猫中,如何从另一个更小且具有相同特征的数据框更新数据框?
- python - 使用 NumPy 将方阵转换为一维数组
- javascript - 如何让javascript将多维数组变成字符串?