【发布时间】:2017-12-05 00:52:43
【问题描述】:
我有一个具有各种搜索类型的应用程序 - 但是这些搜索之间的许多功能是相同的,此外,除了一些字符串(面板标题等)之外,视图几乎相同。
我有一个基本 SearchComponent 和一个 Specialized 搜索组件。 Specialized 搜索组件在标记中实例化基本 SearchComponent 并设置适当的输入。
每个专门的搜索组件使用不同的搜索策略,即服务实例和方法以及结果的映射。
目前我在实例化基础组件时将函数引用绑定到父函数,以便可以调用父函数。但是看起来 DI 上下文是不同的,所以它抱怨我在父级中注入的服务没有找到。
我该如何解决这个问题?
例子:
在 search-base.ts 中:
@Input() execSearchFn: (query) => Observable<any>;
@Input() mapTableDataFn: (i: any) => any;
executeSearch(e) { // Triggered by some event
this.execSearchFn(e.query); // delegate to parent for specialized search
}
在 xyz-search.html:
<app-search-base #appSearchBase
searchTitle="XYZ Search"
[execSearchFn]="execSearch"
[mapTableDataFn]="mapTableData">
</app-search-base>
在 xyz-search.ts 中:
constructor(private xyzService: XYZService) {}
execSearch(query: string) {
return this.xyzService.search(query); // does not work! xyzService is undefined!
}
这很好用,调用了父级中的函数,但找不到任何注入的属性。
错误是“无法读取未定义的属性搜索”。果然 xyzService 被注入并在构造函数中定义,但由于调用上下文来自基本组件,它在 execSearch 函数中未定义。
我的目标功能类似于在基类中定义一个抽象方法和一个为该抽象方法定义确切行为的子类。但是 Angular 不允许使用抽象组件,因此必须使用上述解决方法。事实上,我可以创建一个常规的抽象基类,但是我不能重用标记。我需要重用基本功能和基本标记。
我猜最好的方法是发出一个执行事件(而不是使用函数引用),然后通过 Input() 将结果发回??这听起来太令人费解了。
【问题讨论】:
标签: angular