Angular 2 个指令现在 "extensible"?
Are Angular 2 directives now "extensible"?
我对 Angular 1 的最大问题是扩展指令(在 object-oriented 意义上)是多么困难。
例如,几乎不可能在我的自定义小部件上重用 input[number]
指令,我必须 re-implement 所有验证和类型转换代码。
Angular 2 个组件作为 类 实现,因此它们似乎可以轻松扩展。但是,他们也有 @Component
带有非常具体的选择器等的注释,这让我不清楚是否可以完全覆盖这些。
那么 Angular 2 个指令实际上是可扩展的吗?
编辑:
好的,"extensible" 不必扩展 类。它可以创建一个由多个现有指令组成的新指令。我对这种方法的问题是应用 child 指令的机制是什么?
(@Component
类 不是传统的 OO 类,它具有可以分派给 children 的方法。它只是字段和回调的容器完全由注释背后的任何内容驱动。)
注释不是继承的,所以如果您有:
@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
输入(或任何其他输入)。因此,如果继承确实对您的用例最有意义,解决这个问题的方法是声明输入等子 class 注释并将它们作为构造函数参数传递给父 class,您可以在其中封装通用功能。
也就是说,我认为可扩展性并不一定意味着继承,根据我的经验,当涉及到 DI 时,古老的格言 "favor composition over inheritance" 更加正确。
比我聪明得多的人最近说,"inheritance will murder your children in their sleep",我自己也倾向于坚持这个观点,除非我非常确定它是适合我的用例的工具。
我对 Angular 1 的最大问题是扩展指令(在 object-oriented 意义上)是多么困难。
例如,几乎不可能在我的自定义小部件上重用 input[number]
指令,我必须 re-implement 所有验证和类型转换代码。
Angular 2 个组件作为 类 实现,因此它们似乎可以轻松扩展。但是,他们也有 @Component
带有非常具体的选择器等的注释,这让我不清楚是否可以完全覆盖这些。
那么 Angular 2 个指令实际上是可扩展的吗?
编辑:
好的,"extensible" 不必扩展 类。它可以创建一个由多个现有指令组成的新指令。我对这种方法的问题是应用 child 指令的机制是什么?
(@Component
类 不是传统的 OO 类,它具有可以分派给 children 的方法。它只是字段和回调的容器完全由注释背后的任何内容驱动。)
注释不是继承的,所以如果您有:
@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
输入(或任何其他输入)。因此,如果继承确实对您的用例最有意义,解决这个问题的方法是声明输入等子 class 注释并将它们作为构造函数参数传递给父 class,您可以在其中封装通用功能。
也就是说,我认为可扩展性并不一定意味着继承,根据我的经验,当涉及到 DI 时,古老的格言 "favor composition over inheritance" 更加正确。
比我聪明得多的人最近说,"inheritance will murder your children in their sleep",我自己也倾向于坚持这个观点,除非我非常确定它是适合我的用例的工具。