从angular documentation开始,我看到子组件可以使用抽象类来请求依赖,父组件可以为子项的依赖提供具体的类。 例如:
@Component({
...
providers:[{provide: AbstractService, useClass: ConcreteService}]
})
export class ParentComponent{}
@Component({...})
export class ChildComponent{
constructor(private service:AbstractService){}
}
通过这样做,子组件可以非常灵活。它的行为可能会有所不同,具体取决于父母注入它的依赖性 但是,如果父母有多个同一类型的孩子,它如何为每个孩子提供不同的依赖性呢 假设我有一个名为Searchbar的子组件。父母需要有两个搜索栏,一个搜索一些硬编码的虚拟数据,一个搜索到服务器的GET请求。我可以通过用不同的父级包装每个子节点来添加另一个层,以便提供不同的服务。有更简单的方法吗?
答案 0 :(得分:0)
我不确定我是否在问题中表明了自己的看法。然而,在重新思考架构之后,我将回答我自己的问题。如果你有更好的解决方案,请评论
问题是如何提供相同组件的不同服务。就像如何注入一个按钮服务来提交表单一样,另一个按钮就是一个保存文件的服务,这两个按钮位于相同的父节点和同一个组件类之下。
我可以将两个服务注入按钮,并在按钮上设置一个标志以使用其中一个服务。这是不可扩展的,并且会使按钮变得非常复杂
更好的方法是让按钮变得愚蠢。 Button不应该关心如何处理数据。它应该只在用户点击时发出事件并让父母处理其他事情
与上面的搜索栏相同。搜索栏不应该关心数据的来源,父级应该进行所有查询,并将格式干净的数据传递给搜索栏。
更新9/6/16
随着Angular RC5和RC6的发布,Angular引入了NgModule。同一模块中的组件共享模块中列出的依赖项。如果我们想要控制单个组件的依赖关系,我们可能会为每个组件创建一个模块。至少这是我从Angular Material看到的。但是,我仍然会尝试使大多数组件变得愚蠢,以便它们不需要依赖。
答案 1 :(得分:0)
回答您的原始问题:(如果目前我理解的话)
由于某种原因,如果您使用provide: ... useClass: ...
语法,并且“使用的类”(在您的情况下为ConcreteService
)与您所要求的类(在您的情况下为AbstractService
),除非您隐式声明它们,否则Angular不会注入这些依赖项:
{
provide: AbstractClass,
useClass: ConcreteClass,
deps: [SomeServiceUsedInConcreteClass, ...]
}
如果有人知道完成同一件事的更好/替代方法,请发表评论。