我编写了一个小组件来装饰引导程序表单控件,它将在多个应用程序中使用。我想把它变成一个库(单独的npm包,单独的@NgModule),但是一些应用程序可能想要自定义模板。我怎样才能让他们这么容易?
我的第一次尝试是在@Component装饰器中使用不同的模板扩展组件类,但我得到了:
[ERROR ->]<form-control labelKey="Issue.StoryPoints" helpKey="Effort estimate by the development team">
<in"): ng:///AppModule/EditIssueComponent.html@34:2
More than one component matched on this element.
Make sure that only one component's selector can match a given element.
Conflicting components: FormControlComponent,MyFormControlComponent ("
</form-control>
我可以使用不同的选择器,但事后更改选择器意味着更新模板中的所有用法,并在前面指定一个独特的选择器让我想起YAGNI ......
我错过了更好的方法吗?
对于一个使覆盖提供者很容易不支持覆盖组件的框架来说,这似乎很奇怪: - (
答案 0 :(得分:2)
你的组件应该像'黑盒'一样。 Inputs
和Outputs
以及一些公开方法。如果组件的用户能够编辑模板,这意味着他需要深入了解组件的内部结构。用户可以通过某些方式更改组件的行为/结构:
如果您希望用户能够在某些地方添加额外的html/template
,则可以在组件的模板中使用ng-content
标记。
如果您希望用户能够仅更改组件的公共API的某些行为,则可以使用extend
而不使用@Component
装饰器。
如果您希望用户必须能够构建自己的组件,那么他们可以选择在组件周围使用包装器,或者使用自己的@Component
扩展组件,并使用它他们自己的前缀选择器。