我有一个组件
@Component({
// todo the app-old-selector selector must be removed in the next version
selector: 'app-new-selector,app-old-selector',
templateUrl: './component.html'
})
export class Component {
}
如何最好地通知开发人员 app-old-selector
已过时?
我有一个组件
@Component({
// todo the app-old-selector selector must be removed in the next version
selector: 'app-new-selector,app-old-selector',
templateUrl: './component.html'
})
export class Component {
}
如何最好地通知开发人员 app-old-selector
已过时?
我编写了一个可重复使用的装饰器,用于将组件的选择器标记为已弃用。
import {Component} from '@angular/core';
type Constructor<T = {}> = new (...args: any[]) => T;
export function Deprecated(oldSelector: string) { // This is a decorator factory
return <T extends Constructor>(Base: T) => {
return class Deprecated extends Base {
selectors = [];
constructor(...args: any[]) {
super(...args);
const selector = new Component((Deprecated as any).__annotations__[0]).selector;
this.selectors = selector.split(', ');
this.selectors = this.selectors.filter(selector => selector !== oldSelector);
console.warn('The selector "' + oldSelector + '" is going to be deprecated. Please use one of these selectors [ ' + this.selectors.toString() + ' ]');
}
};
};
}
@Component({
selector: 'my-old-app, my-app-new',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
@Deprecated("my-old-app")
export class AppComponent {
name = 'Angular';
}
你可能可以在组件代码内编写类似以下内容的代码:
import { Component, ElementRef } from '@angular/core'
@Component({
selector: 'app-new-selector,app-old-selector',
templateUrl: './component.html'
})
export class YourComponent {
constructor(elem: ElementRef) {
const tagName = elem.nativeElement.tagName.toLowerCase();
if (tagName === 'app-old-selector') {
console.warn('message');
}
}
}
这意味着我们只需将当前启动组件的标签名称与表示废弃值的字符串进行比较。如果它们相等-这意味着您现在需要通知开发人员。
这里有一个工作的Stackblitz示例,请随意打开控制台运行它。
/**
* @deprecated write further comments here
*/
@Component({
selector: 'component-name',
templateUrl: './component-name.component.html',
styleUrls: ['./component-name.component.scss']
})
import { reflectComponentType } from '@angular/core';
/**
* Deprecation decorator
*/
export function Deprecated(newSelector: string): ClassDecorator {
return (target: any) => {
const metadata = reflectComponentType(target);
const selector = metadata.selector;
console.error(`❌ The selector <${selector}> is deprecated. Use <${newSelector}> instead.`);
}
}
可以用作:
@Component({
selector: 'ui-preview-image',
})
@Deprecated('ui-new-preview')
export class PreviewImageComponent implements OnInit, OnChanges {
ElementRef
功能来提醒开发人员: "最初的回答"import { Component, ElementRef } from '@angular/core'
@Component({
selector: 'app-new-selector,app-old-selector',
templateUrl: './component.html'
})
export class MyComponent {
constructor(elem: ElementRef) {
if (elem.nativeElement.tagName.toLowerCase() === 'app-old-selector') {
console.warn(`'app-old-selector' selector is deprecated; use 'app-new-selector' instead.`);
}
}
}
或者,如果您需要使此功能可重用并希望确保库中的一致性,则可以创建一个可注入服务,如下所示:
最初的回答:
或者,如果你想让这个特性可以被重复使用,并且想要确保你的库的一致性,你可以创建一个可注入的服务,像这样:
import { Injectable } from '@angular/core';
@Injectable()
export class Deprecator {
warnDeprecatedSelector(elem: ElementRef, oldSelector: string, newSelector: string) {
if (elem.nativeElement.tagName.toLowerCase() === oldSelector) {
console.warn(`'${oldSelector}' selector is deprecated; use '${newSelector}' instead.`);
}
}
}
import { Component, ElementRef } from '@angular/core'
@Component({
selector: 'app-new-selector,app-old-selector',
templateUrl: './component.html'
})
export class MyComponent {
constructor(elem: ElementRef, deprecator: Deprecator) {
deprecator.warnDeprecatedSelector(elem, 'app-old-selector', 'app-new-selector');
}
}
/**
* @deprecated DO NOT USE THIS TABLE.
*/
@Component({
selector: 'app-table-old',
templateUrl: './old-table.component.html',
styleUrls: ['./old-table.component.scss']
})