我对Angular 1的最大问题是扩展(在面向对象的意义上)指令是多么困难.
例如,几乎不可能input[number]
在我的自定义小部件上重用该指令,我不得不重新实现所有验证和类型转换代码.
Angular 2组件实现为类,因此它们似乎可以轻松扩展.但是,它们也有@Component
非常具体的选择器等注释,这使我不清楚是否可以完全覆盖它们.
那么Angular 2指令实际上是可扩展的吗?
编辑:
好的,"可扩展"不一定是扩展类.它可以创建一个由多个现有指令组成的新指令.我对这种方法的问题是应用子指令的机制是什么?
(这些@Component
类不是传统的OO类,其中包含可以分配给子代的方法.它只是一个字段和回调的容器,完全由注释背后的内容驱动.)
注释不是继承的,所以如果你有:
@Directive({ selector:'foo', inputs:['bar'] }) export class Foo {} //no annotation export class FooBar extends Foo {} //not a directive @Directive({ selector:'foobaz' }) export class FooBaz extends Foo {} //is a directive, but has no inputs
FooBar
根本不会被承认为指令,FooBaz
但不会bar
输入(或任何其他).因此,如果继承实际上是对您的用例最有意义的,那么接近它的方法是在子类注释中声明输入等,并将它们作为构造函数参数传递给父类,您可以在其中封装公共功能.
也就是说,我认为可扩展性并不一定意味着继承,而且根据我的经验,当涉及到DI时,旧的格言"赞成合成而非继承"是双重的.
最近比我更聪明的人说,"继承会在睡梦中谋杀你的孩子",我倾向于自己坚持这个观点,除非我确定它是我的用例的正确工具.