Inheritance of Angular 5 components with overriding the decorator properties

前端 未结 1 1605
滥情空心
滥情空心 2021-01-13 16:29

In Angular 2/4 we could create custom decorator for extending parent component. Actual overriding of the decorator properties was handled as needed in the custom decorator.

相关标签:
1条回答
  • 2021-01-13 16:43

    At the end I came up to this implementation of a custom decorator (extendedcomponent.decorator.ts):

    import { Component } from '@angular/core';
    
    export function ExtendedComponent(extendedConfig: Component = {}) {
        return function (target: Function) {
            const ANNOTATIONS = '__annotations__';
            const PARAMETERS = '__paramaters__';
            const PROP_METADATA = '__prop__metadata__';
    
            const annotations = target[ANNOTATIONS] || [];
            const parameters = target[PARAMETERS] || [];
            const propMetadata = target[PROP_METADATA] || [];
    
            if (annotations.length > 0) {
                const parentAnnotations = Object.assign({}, annotations[0]);
    
                Object.keys(parentAnnotations).forEach(key => {
                    if (parentAnnotations.hasOwnProperty(key)) {
                        if (!extendedConfig.hasOwnProperty(key)) {
                            extendedConfig[key] = parentAnnotations[key];
                            annotations[0][key] = '';
                        } else {
                            if (extendedConfig[key] === parentAnnotations[key]){
                                 annotations[0][key] = '';
                            }
                        }
                    }
                });
            }
            return Component(extendedConfig)(target);
        };
    }
    

    Example usage:

    First implement the parent component as usual (myparent.component.ts):

    import { Component, Output, EventEmitter, Input } from '@angular/core';
    @Component({
        selector: 'my-component',
        templateUrl: 'my.component.html'
    })
    export class MyParentComponent implements OnInit {
        @Input() someInput: Array<any>;
        @Output() onChange: EventEmitter<any> = new EventEmitter();
    
        constructor(
            public formatting: FormattingService
        ) {
        }
    
        ngOnInit() {
    
        }
    
        onClick() {
            this.onChange.emit();
        }
    }
    

    After that implement child component which inherit the parent component:

    import { Component, OnInit } from '@angular/core';
    import { ExtendedComponent } from './extendedcomponent.decorator';
    import { MyParentComponent } from './myparent.component';
    
    
    @ExtendedComponent ({
        templateUrl: 'mychild.component.html'
    })
    
    export class MyChildComponent extends MyParentComponent {
    }
    

    Note: This is not officially documented and may not work in many cases. I hope that it will help somebody else, but use it at your own risk.

    0 讨论(0)
提交回复
热议问题