【发布时间】:2018-04-26 10:17:51
【问题描述】:
我有三个非常相似的自定义下拉组件:
- 基础下拉菜单
- 搜索下拉菜单
- 带有高级搜索功能的下拉菜单
他们有许多共同的行为,但也有一些不同。我决定将它们分成三个不同的组件,因为当它是一个具有 20 个 @Input() 属性和许多 if else 用于选择一种或其他行为的大组件时,这很糟糕。他们也有相同的下拉选项。所以唯一的区别是 input(header, idk 如何正确调用它) 和 button-press 处理程序。
这里是简化的example
所以我在base-dropdown 组件中有setDropdownPosition() 方法。它计算应该在哪里打开下拉菜单 - 在输入上方或下方。在dropdown-witch-search 组件中,我可以访问父方法,例如toggleOptions() 或setDropdownPosition()。但我无权访问父 @ViewChild('dropdownContainer') dropdownContainer: ElementRef; 以将他定位在扩展组件中。并且setDropdownPosition() 抛出一个错误。早些时候我在每个组件中都有自己的模板(并且它可以工作),但是每个模板中有很多可重复的东西,就像我之前提到的 - 选项等。
解决此问题的最佳方法是什么?谢谢
【问题讨论】:
-
您的实际期望是什么?
-
正如我在问题中所描述的,我想要不同的下拉组件。 Base-dropdown - 没什么特别的 - 它就像现在一样工作。但是对于
dropdown-witch-search,我希望拥有基本下拉菜单的功能以及更多内容,我将把它们作为内容放入<base-dropdown>。现在在dropdown-witch-search我没有@ViewChild('dropdownContainer') dropdownContainer的访问权限,我无法选择在哪里显示组件 -
将所有逻辑都放在一个组件中,并使用
input来区分它们。 -
你读过这个问题吗?我写道:“我决定将它们分成三个不同的组件,因为当它是一个具有 20 个 @Input() 属性的大组件时,如果要选择一种或其他行为的话,那是很糟糕的”,您建议将所有组件合二为一。 ..
标签: javascript angular angular5