完成此https://api.xforce.ibmcloud.com/url/cnn.com并具有以下内容:
import {TodoDataService} from './todo-data.service';
@Component({
// ...
providers: [TodoDataService]
})
constructor(private todoDataService: TodoDataService) {
}
IIUC我们必须在providers数组中声明TodoDataService
。这似乎是多余的。 Angular DI是否可以读取组件生成的元数据并使用构造函数注入自动注入TodoDataService
?
Angular已将此实现为todo tutorial。我要求他们删除providedIn:root
,他们说他们在路线图上有相关内容。
答案 0 :(得分:3)
注射器冒泡
当组件请求依赖项时,Angular会尝试使用在该组件自己的注入器中注册的提供程序来满足该依赖项。如果组件的注入器缺少提供程序,它会将请求传递给其父组件的注入器。如果该注入器无法满足请求,则将其传递给其父注入器。这些请求不断冒泡,直到Angular找到一个能够处理请求或用完祖先注射器的注射器。如果它用完了祖先,Angular会抛出一个错误。
我对此的理解是,如果您的组件提供服务,您将获得该服务的一个实例每个组件。如果没有,它会向上移动组件树,直到它找到提供它的东西。所以某些东西必须提供它。
我认为实际确实检查生成的元数据,但它只是用它来查看组件需要的服务,而不是服务的来源(providers:[TodoDataService]
是什么对)。
在我的应用程序中,我的app.module.ts
提供了大部分服务,因此我在整个应用程序中获得了每个服务的一个实例。