gpt4 book ai didi

angular5 - 继承 Angular 5 组件并覆盖装饰器属性

转载 作者:行者123 更新时间:2023-12-01 13:27:57 26 4
gpt4 key购买 nike

在 Angular 2/4 中,我们可以创建自定义装饰器来扩展父组件。装饰器属性的实际覆盖是根据需要在自定义装饰器中处理的。为了获取我们使用的父注释:
let parentAnnotations = Reflect.getMetadata('annotations', parentTarget);
更新到 Angular 5 后,这不再起作用。关于this
我们可以使用的答案:
target['__annotations__'][0]用于获取父组件注释。

为了在 Angular 2/4 的当前组件中设置注释,我们使用了:
let metadata = new Component(annotation);
Reflect.defineMetadata('annotations', [ metadata ], target);

如何在 Angular 5 中设置当前组件注释?

最佳答案

最后我想到了自定义装饰器的这个实现(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);
};
}

用法示例:

首先像往常一样实现父组件(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();
}
}

之后实现继承父组件的子组件:
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 {
}

注意:这没有正式记录,在许多情况下可能不起作用。我希望它会帮助其他人,但使用它需要您自担风险。

关于angular5 - 继承 Angular 5 组件并覆盖装饰器属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47504711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com