我在Angular 2中有组件和指令的继承和装饰(如Decorator模式)的一些用例。
该示例是具有基本模板的组件,不适合该情况,以便更容易定义新模板而不是以编程方式修改现有模板的DOM。其余的组件元数据应该是继承的。
基本上是
export const BASE_SOME_COMPONENT_METADATA = { ... };
@Component(BASE_SOME_COMPONENT_METADATA);
export class BaseSomeComponent { ... }
...
import { BaseSomeComponent, BASE_SOME_COMPONENT_METADATA } from '...';
@Component(Object.assign({}, BASE_SOME_COMPONENT_METADATA, { template: '...' });
export class SomeComponent extends BaseSomeComponent {}
更复杂的案例是
@Component({ ... });
export class ThirdPartyComponent {
@Input() ...;
@Input() ...;
@Input() ...;
...
}
...
import { ThirdPartyComponent as BaseThirdPartyComponent } from '...';
@Component({
// may modify or replace any of the original properties
template: ...,
styles: ...
...
});
export class ThirdPartyComponent extends BaseThirdPartyComponent {}
请注意ThirdPartyComponent
有很多输入。可能存在这样的情况:在内部修改组件而不是包装它并从外部修改其行为是有益的。在模板中枚举它们并将它们传递给ThirdPartyComponent
的包装器组件可能是WET和脏的:
<third-party inputs="inputs" that="that" should="should" be="be" enumerated="enumerated">
在某些情况下,可能会禁止由包装器组件引入的额外布局元素。
ThirdPartyComponent
可能是其他第三方组件使用的核心组件(按钮)。那么他们也应该受到影响,所以可能需要装饰装饰者。整个喷油器,不只是延长它。
在Angular 1.x中thirdPartyDirective
是一种服务,可以完全访问组件DDO,因此可以对它们进行修饰,扩展,深度煎炸等。在Angular 2中,这种方法的直接对应方式是什么? 如果这违反了一些规则并使保修无效,那就没问题。
如何扩展不导出其元数据的组件/指令?
如何修改现有组件的元数据?
答案 0 :(得分:2)
您的输入将自动从父类继承。关于Component
装饰器本身的属性,在Angular2中没有本地方法可以做到这一点。 Angular2团队不会为此提供支持:https://github.com/angular/angular/issues/7968#issuecomment-219865739。
如果您真的想要这样的东西,您需要使用更新注释的自定义装饰器来实现......
这篇文章让您感兴趣: