如何允许我的库用户覆盖组件模板?

时间:2017-11-08 15:16:25

标签: angular typescript

我编写了一个小组件来装饰引导程序表单控件,它将在多个应用程序中使用。我想把它变成一个库(单独的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 ......

我错过了更好的方法吗?

对于一个使覆盖提供者很容易不支持覆盖组件的框架来说,这似乎很奇怪: - (

1 个答案:

答案 0 :(得分:2)

你的组件应该像'黑盒'一样。 InputsOutputs以及一些公开方法。如果组件的用户能够编辑模板,这意味着他需要深入了解组件的内部结构。用户可以通过某些方式更改组件的行为/结构:

如果您希望用户能够在某些地方添加额外的html/template,则可以在组件的模板中使用ng-content标记。

如果您希望用户能够仅更改组件的公共API的某些行为,则可以使用extend而不使用@Component装饰器。

如果您希望用户必须能够构建自己的组件,那么他们可以选择在组件周围使用包装器,或者使用自己的@Component扩展组件,并使用它他们自己的前缀选择器。